我修复了现有 C# 项目中的一些错误。我使用 Visual Studio 2008 和 3.5 .NET Framework。
应用程序使用窗体,并且应用程序的生命周期正常工作。我还没有做任何改变,但客户最近开始遇到奇怪的行为。第一次使用该应用程序可以毫无问题,但是如果关闭了一个表单,而我们打开了另一个表单,则此表单中的对象将被释放。代码用于PDA,我们有一个用于扫描的事件处理程序。我相信这很奇怪,因为代码中没有任何内容被更改。也许是一些框架错误?
我试图完全消除 Closing 事件上的事件处理程序,但发生了同样的错误。更改表单的处置方式。
表单创建
FormTEntreUbicaciones form = new FormTEntreUbicaciones(Movements.TREntreUbicaciones);
form.ShowDialog();
form.Dispose();
事件创建
if (Device.GetOSType2() == Device.OSType.WinMobile){
hDcd = new DecodeHandle(DecodeDeviceCap.Exists | DecodeDeviceCap.Barcode);
DecodeRequest reqType = (DecodeRequest)1 | DecodeRequest.PostRecurring;
dcdEvent = new DecodeEvent(hDcd, reqType, this);
dcdEvent.Scanned += new DecodeScanned(dcdEvent_Scanned);
}
表单应该是开放的,并且不应释放其中的所有对象
例外:
System.ObjectDisposedException was unhandled
Message="ObjectDisposedException"
ObjectName=""
StackTrace:
at System.Windows.Forms.Control.InvokeHelper(Delegate method, Boolean fSynchronous, Object[] rgobjArgs)
at System.Windows.Forms.Control.Invoke(Delegate method)
at Datalogic.API.DecodeEvent.WaitForScan()
有什么建议吗?谢谢!
最后,我找到了一个解决方案。
在弄清楚出了什么问题之后,我发现 SCAN 事件一直处于活动状态。
我添加了一个关闭覆盖:
this.Closing += MyClosedHandler;
MyClosedHandlerEvent 如下所示:
//FIX MA 23.07.2019
protected void MyClosedHandler(object sender, EventArgs e)
{
if (dcdEvent.IsListening)
{
dcdEvent.StopScanListener();
}
if (hDcd != null)
{
hDcd.Dispose();
}
}
在 datalogic.api.dll 中检测到问题。使用的PDA是Skorpio x3。
希望这对其他人有所帮助!