簡體   English   中英

VB.NET 2005,串行端口,配置問題,Windows CE

[英]VB.NET 2005, Serial port, dispose problem, Windows CE

我為Windows CE編寫了應與串行端口一起使用的程序。 我使用對象System.IO.Ports.SerialPort 一切正常,但是當我關閉程序並再次打開它時,我收到錯誤消息:端口正在使用中! 最后,我寫:

port.close()
port.dispose()

如果我添加此:

System.GC.collect() 

..比一切都開始起作用

但是問題是,當為每個端口調用垃圾收集器時,計算機會卡住。 如果我嘗試在其他地方使用收集器,則它不會“收集”端口,並且如果程序再次啟動,它們看起來就像使用的端口。

有人可以幫忙嗎?

這里有一些潛在的可能性。 首先,僅因為您調用Close,並不意味着該端口已被物理釋放-即使在C語言中也是如此。這取決於UART的狀態以及很大程度上取決於實際驅動程序的編寫方式。 從調用Close到釋放端口的實際驅動程序可能要花費一些時間。 我相信,這是您實際上看到的,因為您實際上是在手動調用close而不是等待Finalizer銷毀Port實例並隱式關閉它-這將花費更長的時間。

當然,這假設您的Close呼叫實際上正在運行。 如果不是,那么您需要了解對象終結處理在托管代碼中的工作方式。 這與OOP無關,與內存的管理方式無關。 當一個對象超出范圍並且沒有更多的根(引用)時,就可以進行收集,但這並不意味着它會立即釋放。 實際上,終結器運行可能需要一段時間,特別是如果應用程序繼續運行。

擁有端口對象的對象可能沒有被處置或仍保留引用。 那可以解釋為什么在system.gc.collect()之后它可以工作。

在關閉和打開之間,您需要等待多長時間? 根據MSDN

對於任何應用程序,最佳做法是在調用Close方法之后等待一段時間,然后再嘗試調用Open方法,因為端口可能不會立即關閉。

暫無
暫無

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

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