0

グローバル変数 SerialPort comm を取得しました。COMポートを開いた後、受け取ったバイトを読んでいると、COMポートが閉じているという例外が発生します.
バックグラウンドワーカーで正しくアクセスするにはどうすればよいですか?
comm を宣言するより良い方法はありますか?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    while(true)
    {
        if ((worker.CancellationPending == true))
        {
            e.Cancel = true;
            break;
        }
        else
        {
            string str = comm.ReadLine();
            //...
        }
    }
}

編集:ええ...これを使用してください http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
BackgroundWorkerは必要ありません

4

1 に答える 1

1

SerialPort.ReadLine() はブロッキング呼び出しです。ポートがテキスト行と NewLine を受信するまで戻りません。これは必然的に CancellationPending のテストが機能しないことを意味し、コードは ReadLine() 呼び出しでスタックします。したがって、bgw の CancelAsync() 呼び出しを呼び出してから、シリアル ポートを閉じます。これにより、ReadLine() メソッドが例外をスローします。

これをきれいに行う良い方法はありません。ReadLine() メソッドを強制的に返す方法は他にありません。したがって、例外をキャッチし、CancellationPending が true かどうかを確認し、true の場合は救済します。

于 2012-12-03T22:32:59.477 に答える