0

我得到了全局变量 SerialPort comm; 打开 com 端口后,我正在读取接收的字节,我得到了 com 端口已关闭的异常。
我如何才能在后台工作人员中正确访问它?
有没有更好的方法来声明通讯?

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() 是一个阻塞调用。在端口收到一行文本和一个新行之前,它不会返回。这不可避免地意味着您对 CancellationPending 的测试将不起作用,代码卡在 ReadLine() 调用中。因此,您将调用 bgw 的 CancelAsync() 调用,然后关闭串行端口。这会导致 ReadLine() 方法抛出异常。

没有好的方法可以干净地做到这一点,您没有任何其他方法可以强制 ReadLine() 方法返回。因此,捕获异常,检查 CancellationPending 是否为真,并在它为真时退出。

于 2012-12-03T22:32:59.477 回答