SerialPort.Close()从components.Components中删除串行端口

时间:2012-06-01 17:32:41

标签: c# winforms serial-port

在C#中,我的Windows窗体上有一个System.IO.Ports.SerialPort组件。我的代码中有几个地方,我循环这样:

foreach (SerialPort in components.Components)
{
    // Do something.
}

但是当我运行components.Components时,每个SerialPort都会从mySerialPort.Close()类中删除,因此所有后续循环都会错过它。这是一个错误吗?或者这是故意的吗?为什么它会像设计那样表现?

内部文档说Close()方法只处理Stream对象。

1 个答案:

答案 0 :(得分:1)

这是设计的。与所有其他.NET框架类一样,SerialPort.Close()方法调用其Dispose()方法。继承自其基类Component。其中使用了处理模式,调用虚拟Dispose(bool)方法。哪个SerialPort会覆盖以关闭其流。并调用base.Dispose(bool)方法,Component使用该方法从集合中删除组件。

这是自然行为,可以将一个SerialPort放在表单上,​​以便在表单关闭时自动处理。在创建窗口时打开一个端口并保持打开直到它关闭也是完全正常的。在程序执行过程中关闭端口只会造成麻烦。但是否则支持,你只需要自己跟踪对象。