Координация данных из двух событий в поток пользовательского интерфейса в C # - PullRequest
0 голосов
/ 10 января 2011

Я пишу код C # WPF, чтобы шпионить за последовательным портом (инструмент отладки).Я создаю два виртуальных порта, соединенных как нуль-модем с com0com (приложение), и использую мой код для считывания одного порта и немедленной отправки другого порта, и наоборот:

HOST <--> Virtual COM <--> C# spy app <--> Real COM <--> TARGET

Для этого у меня естьсоздал один класс для управления объектом SerialPort, который создает событие DataReceived.В этой реализации у меня было бы два экземпляра этого класса, один для управления связью HOST, а другой для цели.Пользовательский интерфейс будет анализировать и отображать данные только из этих двух классов.

Проблема: последовательные порты работают в потоках, отличных от пользовательского интерфейса ... и у меня два из них пытаются обновить один и тот же пользовательский интерфейс.

Мой подход к этому состоит в создании открытого List<T>, где T может быть struct { byte[] data; Direction direction}, к которому каждый обработчик событий будет добавлять свои данные, тогда как пользовательский интерфейс может анализировать эти данные.Обработчики событий будут выполнять List.Add (), а пользовательский интерфейс - List.RemoveAt (0), пока существуют данные.Скорость передачи данных: 19200 бит / с (1 байт каждые 0,5 мс).

Вопросы: Могут ли обработчики событий из двух разных последовательных портов прерывать друг друга и повреждать данные списка?Повлияет ли использование объекта List на производительность?Должен ли я попробовать массив массивов и просто отслеживать индексы?

Или я должен сделать что-то совершенно другое?

1 Ответ

3 голосов
/ 10 января 2011

Могут ли обработчики событий от двух разных последовательных портов прерывать друг друга и повреждать данные Списка?

Абсолютно, событие DataReceived возникает в потоке потоков. Здесь работает цирк с тремя кольцами, два потока, которые могут получать что-то одновременно, поток пользовательского интерфейса, который одновременно читает полученные данные. Блокировка необходима для защиты списка <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...