我在尝试停止 SerialPort 时遇到了一种奇怪的行为:取消订阅和调用后 DataReceived 事件继续触发close
!(见StopStreaming
下面的代码)。结果,在我的事件处理程序代码中,我得到了一个 InvalidOperationException 消息“端口已关闭”。
我错过了什么?关闭端口和停止事件的正确方法是什么?
编辑:每次运行代码时都会出现此错误。因此,这不是随机发生的竞争条件,而是表明代码完全损坏的系统问题!但是,我看不到如何...
private SerialPort comPort = new SerialPort();
public override void StartStreaming()
{
comPort.Open();
comPort.DiscardInBuffer();
comPort.DataReceived += comPort_DataReceived;
}
public override void StopStreaming()
{
comPort.DataReceived -= comPort_DataReceived;
comPort.Close();
isStreaming = false;
}
private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (e.EventType == SerialData.Chars)
{
SerialPort port = (SerialPort)sender;
int N = comPort.BytesToRead;
for (; N > 0; N--)
{
byte b = Convert.ToByte(comPort.ReadByte());
//... process b
}
}
}
编辑:按照建议,我将StopStreaming
代码更改为:
public override void StopStreaming()
{
comPort.DataReceived -= comPort_DataReceived;
Thread.Sleep(1000);
comPort.DiscardInBuffer();
Thread.Sleep(1000);
comPort.Close();
isStreaming = false;
}
它现在似乎有效,但我并不那么高兴。我希望有一种更有效的方法来删除回调,而不是在程序中插入睡眠时间。