C# BackgroundWorker和对全局变量的访问

C# BackgroundWorker和对全局变量的访问,c#,serial-port,c#-2.0,backgroundworker,C#,Serial Port,C# 2.0,Backgroundworker,我得到了全局变量SerialPort comm;打开com端口后,我正在读取接收到的字节,但com端口关闭时出现异常。 如何在backgroundworker中正确访问它?是否有更好的方法来声明comm private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; while(true)

我得到了全局变量SerialPort comm;打开com端口后,我正在读取接收到的字节,但com端口关闭时出现异常。
如何在backgroundworker中正确访问它?
是否有更好的方法来声明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();
            //...
        }
    }
}
编辑:是。。。只需使用这个
就不需要BackgroundWorker了

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


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

这是MSDN中的示例,当看到此
if((worker.CancellationPending==true))
时,我总是笑,应该是
if(worker.CancellationPending==true)
我在您包含的代码中没有看到任何全局变量,需要添加它,以便我们可以确切地看到它是什么类型。您是否尝试过设置DataReceived EventHandler。您可以在UI线程中读取串行端口。当然,除非它显著影响您的UI。从BGworker使用com不是问题,如果您打算写入全局共享缓冲区,只需添加锁()。当前超时设置为-1。我是第一次使用backgroundworker,所以我不知道该怎么做。我只想读取接收到的字节,并将它们作为十六进制和ASCII码放入表中