C # События запускаются не по темам - PullRequest
2 голосов
/ 23 февраля 2011

Все

У меня есть приложение, которое позволяет пользователю общаться с несколькими последовательными устройствами. Класс менеджера используется для запуска приложения, которое создает новый поток для каждого последовательного устройства. Внутри этого потока создается последовательное устройство, а поток и объект последовательного устройства сохраняются в классе менеджера для последующего использования.

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

Моя проблема заключается в том, что когда класс com-порта запускает событие, уведомляющее класс последовательного порта, класс последовательного порта получает событие и продолжает обработку в потоке com-порта. Аналогично, если пользователь отправляет какую-либо информацию в com-порт, все это выполняется в потоке пользовательского интерфейса.

Я добавлю код в качестве правки позже, но сейчас, если кто-нибудь заметит что-то очевидное, я был бы очень признателен.

Я попытался получить событие в классе устройства с последовательным интерфейсом, а затем вызвал метод, чтобы проверить, запускает ли он его в правильном потоке, но это не помогло.

Я знаю, что поток последовательного устройства работает так же, как я выполняю Application.Run внутри класса после того, как он создал классы com-порта.

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

Большое спасибо

EDIT:

Забыл упомянуть, что это приложение Winforms в .NET 2.0, поэтому Dispatcher недоступен

EDIT: Итак, похоже, что информация передается внутри потока DataReceived (я думаю, что это также не поток com-порта). Я также пытался использовать BackgroundWorker для класса последовательных устройств, но это также не имело никакого значения. Помощь * * 1023

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

.NET 2.0 имеет SynchronizationContext.Это небольшая боль (вы должны передать контекст из потока пользовательского интерфейса остальным), но это должно сработать.

Подробнее здесь: http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

1 голос
/ 23 февраля 2011

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

Переключение с потока порта на поток пользовательского интерфейса можно выполнить с помощью Dispatcher.CurrentDispatcher

Это то, что вы ищете?

РЕДАКТИРОВАТЬ Я предполагаю, что приложение WinForms

...