gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:51:03 30 4
gpt4 key购买 nike

我在我的桌面应用程序中做了一些非常简单的错误记录,该应用程序通过 SerialPort 与设备通信。我做的一件事是设置一个全局异常捕获器,它除了使用以下方法记录堆栈跟踪外什么都不做:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;

我有一个用户在他的日志中出现错误。没有其他人有这个问题。我不知道在哪里搜索这个未捕获的异常。而且我不知道我应该在哪里尝试捕捉它,因为我不完全理解它是什么。

我使用 .NET SerialPort 对象,我所做的只是打开端口并进行一些简单的读写。

有谁能解释这个异常是什么/意味着什么,我可以做些什么来修复它,或者我应该去哪里 try catch 错误?每次我触摸我的 SerialPort 对象时,我都是在 try 和 catch block 中这样做的。所以我完全不知所措。

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

最佳答案

我使用了用户 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
}
}

这已经解决了用户的问题。

关于c# - 我认为我的 SerialPort 对此 ObjectDisposedException 负责,但我不知道它发生在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22076860/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com