我正在使用.NET 4串行端口类和DataReceived处理程序。
在DataReceive处理程序中,我从串口删除处理程序,处理数据,并在函数末尾重新添加处理程序。
try
{
serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived);
// readline and process data
}
catch (exception ex)
{
}
finally
{
serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived);
}
这种用法有什么后果?虽然我没有长期测试,但似乎工作得很好。我应该研究一种不同的方法吗?如果可能,请提供简单的代码示例/大纲。谢谢。
答案 0 :(得分:0)
我个人不会删除每个DataReceived事件的处理程序,它是不必要的。如果您没有收到传入数据的通知,则总是有可能超出现有缓冲区并丢失信息。
我会使用与Microsoft Example类似的东西:
从上面的MSDN文章:
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
答案 1 :(得分:0)
如果您担心可重入,请使用lock
或互斥:
lock(lockobj)
{
/*Read data from the port here.*/
}
取消订阅该事件并不能成功阻止重入,因为由于抢占式调度(与合作多线程或类似的东西相反),您的代码可能在进入方法之后(甚至在之前)被抢占之前你有机会取消订阅,更多的数据到达,再次触发机制。
实际上,文档明确说明,
答案 2 :(得分:-2)
关于此代码:
catch (exception ex)
{
}
永远,永远,永远,永远,永远,永远,永远,永远不会写出这样的代码。
就像拆掉孩子卧室里的烟雾探测器一样。