我认为我的SerialPort负责此ObjectDisposedException,但我不知道它在哪里发生

时间:2014-02-27 18:11:52

标签: c# .net exception serial-port

我在桌面应用程序中执行了一些非常简单的错误记录,它通过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()

2 个答案:

答案 0 :(得分:3)

我使用了来自用户O.O和此SO问题的一些帮助。我做的很傻。

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使用任务的问题。