VB.NET 2005,串口,配置问题,Windows CE

时间:2011-04-12 11:17:18

标签: windows vb.net windows-ce serial-port dispose

我为Windows CE编写应该使用串行端口的程序。我使用对象System.IO.Ports.SerialPort。一切正常,但当我关闭程序并再次打开它时,我收到错误:端口正在使用中!最后我写道:

port.close()
port.dispose()

如果我加上这个:

System.GC.collect() 

..比一切都开始工作

但问题是当为每个端口调用垃圾收集器时计算机会卡住。如果我试图在其他地方使用收集器,它不会“收集”端口,如果程序再次启动,它们看起来就像使用了一样。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

这里有一些潜在的可能性。首先,仅仅因为你调用Close,这并不意味着端口是物理释放的 - 即使在C中也是如此。这取决于UART的状态以及关于如何编写实际驱动程序的大量内容。从调用Close到实际驱动程序释放端口可能需要一些时间。我相信这是你实际看到的,因为你实际上是在手动调用close而不是等待Finalizer来破坏你的Port实例并隐式关闭它 - 这需要更长的时间。

当然,这假设您的Close呼叫实际上正在运行。如果不是,那么您需要了解对象Finalization如何在托管代码中工作。这与OOP无关,它与内存管理方式有关。当一个对象超出范围并且没有更多的根(引用)时,它可用于收集,但这并不意味着它立即被释放。实际上,在终结器运行之前可能需要一段时间,特别是如果应用程序继续运行。

答案 1 :(得分:0)

可能是拥有端口对象的对象未被处置或仍保留引用。这可以解释为什么在system.gc.collect()之后它可以工作。

答案 2 :(得分:0)

你在关闭和打开它之间等了多久?根据{{​​3}}:

  

任何应用程序的最佳实践   是等待一段时间   之后调用关闭方法之后   尝试调用Open方法,如   港口可能不会立即关闭。