我在桌面应用程序中执行了一些非常简单的错误记录,它通过SerialPort
与设备通信。我做的一件事是设置一个全局异常捕获器,除了使用:
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
我有一个用户在他的日志中出现错误。没有其他人有这个问题。我不知道在哪里搜索这个未被捕获的异常。我不知道我应该在哪里抓住它,因为我不完全明白它是什么。
我使用.NET SerialPort
对象和我所做的所有操作来打开端口并进行一些简单的读写操作。
是否有人能够解释这个异常/意味着什么,我可以做些什么来解决它,或者我应该尝试去捕捉错误?每次我触摸我的SerialPort
对象时,我都是在try和catch块中进行的。所以我完全失去了。
System.ObjectDisposedException: Safe handle has been closed
at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
at System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile, NativeOverlapped* lpOverlapped, Int32& lpNumberOfBytesTransferred, Boolean bWait)
at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:3)
public bool OpenPort()
{
try
{
if (_port != null && _port.IsOpen)
{
new Thread(_port.Close).Start();
Thread.Sleep(500);
}
// Open the port code
return true;
}
catch (Exception e)
{
// Error handling code
return false;
}
}
我正在做你上面看到的。因为我正在将呼叫线程关闭,我的Try / Catch什么也没做。从其他问题的答案来看,看起来如果不调用SerialPort.Close()
而调用Dispose()
就是问题。
public bool OpenPort()
{
try
{
if (_port != null && _port.IsOpen)
{
new Thread(CloseSerialPortCleanly).Start();
Thread.Sleep(500);
}
// Open the port code
return true;
}
catch (Exception e)
{
// Error handling code
return false;
}
}
private void CloseSerialPortCleanly()
{
try
{
if (_port != null && _port.IsOpen)
{
_port.Close();
_port.Dispose();
_port = null;
}
}
catch
{
// Error handling code
}
}
这解决了用户的问题。
答案 1 :(得分:1)
看起来异常被抛出在另一个线程上。将try-catch块移动到执行读/写操作的线程中,看看是否可以解决您的问题。
另请参阅this使用任务的问题。