我得到了全局变量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
答案 0 :(得分:1)
SerialPort.ReadLine()是一个阻塞调用。在端口收到一行文本和NewLine之前,它不会返回。这不可避免地意味着你的CancellationPending测试不起作用,代码卡在ReadLine()调用中。因此,您将调用bgw的CancelAsync()调用,然后关闭串行端口。这会导致ReadLine()方法抛出异常。
没有好的方法可以干净利落地执行此操作,您没有任何其他方法可以强制ReadLine()方法返回。因此,捕获异常,检查CancellationPending是否为真,并在它出现时挽救。