簡體   English   中英

關閉.NET SerialPort后的ObjectDisposedExecption

[英]ObjectDisposedExecption after closing a .NET SerialPort

我使用.NET 4 SerialPort對象與連接到COM1的設備進行通信。

當我完成設備后,我在SerialPort上調用Close。 我不會調用Dispose,但我相信Close和Dispose在這里是同義詞。

通常這很好用。

但是,有時我會在一段時間后得到以下異常(我看到的時間范圍從5毫秒到175毫秒):

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

我的代碼都沒有在這個堆棧上。

我找到了http://blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.html ,但那里的解決方案沒有用。 在進一步檢查時,問題是IOException ,而不是ObjectDisposedException

關於USB-to-serial設備拔出時觀察到的問題,有很多帖子,但是COM1在板載,所以它並沒有意外消失。

這里的問題也不是我的問題; SerialPort在其使用期間保持活動狀態,並且僅在我與設備通話時才關閉。 (一旦我完成,設備處於不會傳輸任何其他數據的狀態。)

SLaks 建議SafeHandle.Dispose的入口處設置一個斷點,以確定我什么時候處理我不應該做的事情,但是我會破壞那個斷點幾十次。 當我使用串行設備時,我單次調用SerialPort.Close調用了三次,其余約一半都在GC線程中。 其余部分似乎與WPF UI元素相關。

我現在不知所措。 我從哪里開始?

有沒有辦法確定哪個SafeHandle屬於哪個對象,所以我可以肯定我沒有意外地處理它?
除了Close之外還有一些咒語我需要正確關閉SerialPort嗎?

我也有這個問題,因為我開始使用以下兩條規則,我再也沒見過。

  1. 始終調用Close(),然后調用Dispose()。
  2. 永遠不要重用SerialPort對象,在需要重新打開端口時始終創建一個新對象。

我知道,他們沒有太多新聞,但它一直在為我工作。

對被處置的調用是記錄在案的行為( 見這里 ) - 我猜你在關閉后嘗試讀/寫(可能在另一個線程中)。 我建議在一個單獨的類中包裝調用並設置一個“關閉”標志。 然后你應該能夠很快找到問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM