BackgroundWorker和访问全局变量

时间:2012-12-03 22:21:51

标签: c# serial-port c#-2.0 backgroundworker

我得到了全局变量SerialPort comm;打开com端口后读取recived字节,我得到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

1 个答案:

答案 0 :(得分:1)

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

没有好的方法可以干净利落地执行此操作,您没有任何其他方法可以强制ReadLine()方法返回。因此,捕获异常,检查CancellationPending是否为真,并在它出现时挽救。