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;
}
今はうまくいっているようですが、私はそれほど幸せではありません。プログラムにスリープ期間を挿入するのではなく、コールバックを削除するより効果的な方法があればいいのにと思います。