我为Windows CE编写应该使用串行端口的程序。我使用对象System.IO.Ports.SerialPort
。一切正常,但当我关闭程序并再次打开它时,我收到错误:端口正在使用中!最后我写道:
port.close()
port.dispose()
如果我加上这个:
System.GC.collect()
..比一切都开始工作
但问题是当为每个端口调用垃圾收集器时计算机会卡住。如果我试图在其他地方使用收集器,它不会“收集”端口,如果程序再次启动,它们看起来就像使用了一样。
有人可以帮忙吗?
答案 0 :(得分:1)
这里有一些潜在的可能性。首先,仅仅因为你调用Close,这并不意味着端口是物理释放的 - 即使在C中也是如此。这取决于UART的状态以及关于如何编写实际驱动程序的大量内容。从调用Close到实际驱动程序释放端口可能需要一些时间。我相信这是你实际看到的,因为你实际上是在手动调用close而不是等待Finalizer来破坏你的Port实例并隐式关闭它 - 这需要更长的时间。
当然,这假设您的Close呼叫实际上正在运行。如果不是,那么您需要了解对象Finalization如何在托管代码中工作。这与OOP无关,它与内存管理方式有关。当一个对象超出范围并且没有更多的根(引用)时,它可用于收集,但这并不意味着它立即被释放。实际上,在终结器运行之前可能需要一段时间,特别是如果应用程序继续运行。
答案 1 :(得分:0)
可能是拥有端口对象的对象未被处置或仍保留引用。这可以解释为什么在system.gc.collect()之后它可以工作。
答案 2 :(得分:0)
你在关闭和打开它之间等了多久?根据{{3}}:
任何应用程序的最佳实践 是等待一段时间 之后调用关闭方法之后 尝试调用Open方法,如 港口可能不会立即关闭。