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;
我有一个用户的日志中显示了一个错误。没有其他人有这个问题。我不知道在哪里搜索这个未捕获的异常。我不知道我应该在哪里抓住它,因为我不完全理解它是什么

我使用.NET
SerialPort
对象,我在打开端口时所做的一切,以及一些简单的读写操作

是否有人能够解释此异常是/意味着什么,我可以做些什么来修复它,或者我应该在哪里尝试捕获错误?每次我触摸我的
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块移动到执行读/写操作的线程中,看看这是否解决了问题。