多线程仍然是我的待办事项列表上,所以标题可能是完全错误的:)如何同步事件处理程序
我的目标是听串口,就像这样:
class MyClass
{
MyOpticalScanner _scanner;
public MyClass()
{
_scanner = new MyOpticalScanner();
_scanner.CodeScanned += CodeScannedEventHandler;
}
private void CodeScannedEventHandler(object sender, CodeScannedEventArgs e)
{
Debug.WriteLine("ThreadID: " + Thread.CurrentThread.ManagedThreadId + " ||| " + e.ScannedCode);
....
// Some code, query the database, etc...
}
}
的扫描仪发送命令数据:001
,002
,003
,004
,005
,......但是,如果在CodeScannedEventHandler代码花费太长时间来处理,然后又引发事件和我不一致的排序。该Debug.WriteLine
在事件处理程序可以给我这样的:
ThreadID: 8 ||| 001
ThreadID: 9 ||| 002
ThreadID: 10 ||| 003
ThreadID: 10 ||| 006
ThreadID: 8 ||| 004
ThreadID: 8 ||| 008
ThreadID: 8 ||| 009
ThreadID: 8 ||| 010
ThreadID: 10 ||| 007
ThreadID: 9 ||| 005
我怎么能保证,每一个新的事件开始,只有当旧的结束来处理?
编辑1 - 我没有告诉你所有的事情,实际上我没有在测试过程中听COM端口,而是我创建了自己的模拟对象。此对象(ScannerMock)使用内部System.Timer并引发Timer.OnTick事件中的CodeScanned事件。问题能在这里吗?
来自Hans Passant's answer中的评论:SerialPort有一个内部锁,可确保DataReceived事件在运行时不能再次被调用。我应该在我的嘲笑扫描仪中包含类似的锁,以及如何?
编辑2:我向我的扫描仪对象添加了锁,并将代码引发了我的事件。它看起来像它的作品:)
为什么你在多个线程中处理值呢?无论如何,您始终可以将其锁定在扫描仪中,因此一次只能触发一个事件。 – 2011-02-09 15:15:01
我不认为问题是'事件处理程序',因为它们不是异步的。 `scan`方法是执行异步的方法,因为事件处理程序来自它,所以看起来他们也是异步的,但它们不是。 – Jaider 2013-01-09 21:12:46