C# 我认为我的SerialPort负责这个ObjectDisposedException,但我不知道它在哪里';发生什么事了
我在我的桌面应用程序中做了一些非常简单的错误记录,它通过C# 我认为我的SerialPort负责这个ObjectDisposedException,但我不知道它在哪里';发生什么事了,c#,.net,exception,serial-port,C#,.net,Exception,Serial Port,我在我的桌面应用程序中做了一些非常简单的错误记录,它通过串行端口与设备通信。我要做的一件事是设置一个全局异常捕获器,它只使用以下命令记录堆栈跟踪: AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; 我有一个用户的日志中显示了一个错误。没有其他人有这个问题。我不知道在哪里搜索这个未捕获的异常。我不知道我应该在哪里抓住它,因为我不完全理解它是什么 我使用.NETSerialPort对象,我在打开端口时所
串行端口与设备通信。我要做的一件事是设置一个全局异常捕获器,它只使用以下命令记录堆栈跟踪:
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
我有一个用户的日志中显示了一个错误。没有其他人有这个问题。我不知道在哪里搜索这个未捕获的异常。我不知道我应该在哪里抓住它,因为我不完全理解它是什么
我使用.NETSerialPort
对象,我在打开端口时所做的一切,以及一些简单的读写操作
是否有人能够解释此异常是/意味着什么,我可以做些什么来修复它,或者我应该在哪里尝试捕获错误?每次我触摸我的SerialPort
对象时,我都是在try-and-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()
异常似乎是在另一个线程上引发的。将try-catch块移动到执行读/写操作的线程中,看看这是否解决了问题
另请参阅有关使用任务的问题。异常似乎是在另一个线程上引发的。将try-catch块移动到执行读/写操作的线程中,看看这是否解决了问题
另请参阅使用任务的问题。我使用了用户和此问题提供的一些帮助。我在做傻事
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;
}
}
我在做你上面看到的事情。因为我正在将呼叫转接到close,所以我的Try/Catch没有任何作用。从对另一个SO问题的回答来看,问题在于调用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
}
}
这解决了用户的问题。我从用户和这个问题中获得了一些帮助。我在做傻事
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;
}
}
我在做你上面看到的事情。因为我正在将呼叫转接到close,所以我的Try/Catch没有任何作用。从对另一个SO问题的回答来看,问题在于调用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
}
}
这解决了用户的问题。堆栈跟踪是什么?“对已处置对象执行操作时引发的异常。”哈哈,对不起,我完全忘了添加堆栈跟踪StackTrace@O.O我很抱歉,因为你发表评论时我没有StackTrace。我意识到这种类型的异常是如何抛出的。但是追踪并没有告诉我(我能看到)如何捕捉或阻止它。这似乎是一个.NET问题。@MichaelMankus-异常似乎是在另一个线程上引发的。将try-catch块移动到执行读/写操作的线程中,看看这是否解决了问题。堆栈跟踪是什么?“对已处置对象执行操作时引发的异常。”哈哈,对不起,我完全忘记添加StackTrace@O.O我很抱歉,因为你发表评论时我没有StackTrace。我意识到这种类型的异常是如何抛出的。但是追踪并没有告诉我(我能看到)如何捕捉或阻止它。这似乎是一个.NET问题。@MichaelMankus-异常似乎是在另一个线程上引发的。将try-catch块移动到执行读/写操作的线程中,看看这是否解决了问题。