【问题标题】:I THINK my SerialPort is responsible for this ObjectDisposedException but I have no idea where it's happening我认为我的 SerialPort 负责此 ObjectDisposedException 但我不知道它发生在哪里
【发布时间】:2014-03-31 08:59:54
【问题描述】:

我在我的桌面应用程序中进行了一些非常简单的错误日志记录,该应用程序通过SerialPort 与设备通信。我要做的一件事是设置一个全局异常捕获器,它只使用以下方式记录堆栈跟踪:

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()

【问题讨论】:

  • 堆栈跟踪是什么?
  • "对已释放对象执行操作时抛出的异常。"
  • 哈哈抱歉我完全忘了添加 StackTrace
  • @O.O 我很抱歉,因为当您发表评论时我没有 StackTrace。我意识到这种类型的异常是如何引发的。但是跟踪没有为我提供有关如何捕获或防止它的信息(我可以看到)。这似乎是一个 .NET 问题。
  • @MichaelMankus - 似乎异常是在不同的线程上引发的。将你的 try-catch 块移动到执行读/写的线程中,看看是否能解决你的问题。

标签: c# .net exception serial-port


【解决方案1】:

我从用户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 什么也没做。从另一个 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
    }
}

这解决了用户的问题。

【讨论】:

    【解决方案2】:

    似乎异常是在不同的线程上引发的。将您的 try-catch 块移动到执行读/写的线程中,看看是否能解决您的问题。

    另请参阅this 使用任务的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多