Многопоточность все еще в моем списке дел, поэтому заголовок может быть совершенно неверным:)
Мой объект прослушивает последовательный порт, например:
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 и вызывает событие CodeScanned для события Timer.OnTick.Может ли проблема быть здесь?
Из комментария в Ответ Ханса Пассанта : SerialPort имеет внутреннюю блокировку, которая гарантирует, что событие DataReceived не может быть вызвано снова во время работы. Должен ли я включить аналогичную блокировку в свой сканерный сканер и как?
Редактировать 2: Я добавил блокировку к своему объекту сканера и вставил в него код, который вызывает мое событие.Похоже, это работает:)