2011-04-12 53 views
0

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

port.close() 
port.dispose() 

,如果我补充一点:

System.GC.collect() 

..比一切都开始工作

但问题是,当垃圾收集器被称为电脑卡每个端口。如果我试图在其他地方使用收集器,它不会“收集”端口,并且如果程序再次启动,它们看起来像使用。

有人可以帮忙吗?

+0

很晚评论,但你可以尝试'使用(SerialPort p = new SerialPort())'。这将自动关闭并处理对象。 – i486 2015-02-23 08:50:00

回答

0

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

+0

我明白这一点。但是,为什么当我将它作为我的程序的最新命令时收集器不工作?我的程序包含一个Module和Sub Main()。在最后我运行收集器,但端口仍然打开:( – Racky 2011-04-12 11:56:01

+0

我也许找到了一个解决方案。VB可能不适用于对象,因为我期望在OOP中,所以我manualy销毁所有端口在主( )方法,但是因为我越来越不认可VB.net和Visual Studio,我越来越喜欢它:(例如,抽象表单是一个好故事:) – Racky 2011-04-12 12:59:57

+0

“VB可能不适用于对象正如我在OOP中预计的那样“ 我不认为它是VB,但是.net框架,并且Windows CE增加了另一层。” – MarcelDevG 2011-04-12 21:28:36

0

你在关闭它并打开它之间等了多久?根据MSDN

The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.

+0

你好。时间延迟并不重要。在程序中我可以调用'port.open()port.close()port.dispose()system .GC.collect()' – Racky 2011-04-13 06:03:46

+0

你好。时间延迟并不重要。在程序中,我可以在“row”中调用'port.open()port.close()port.dispose()system.GC.collect()'并且它可以工作。问题是程序不能调用这个端口的析构函数,我使用dispose()和collect()。那就是问题所在。我认为这可能是由于我的程序没有主要类而是主要模块。所以我在Module的结尾调用了析构函数,它现在可以工作。 – Racky 2011-04-13 06:09:16

1

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

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