2013-11-22 3 views
2

Я создаю приложение, в котором можно отслеживать некоторые аппаратные средства MCU (показания датчиков и т. Д.) В режиме реального времени. Для связи я использую CAN-шину.C# .Net 4.5 Связь между потоками

В основном у меня есть 2 темы на данный момент. Один из них - основной поток, в котором работает GUI, а другой - управление/мониторинг связи между устройством. Поэтому очевидно, что мне нужно передать данные из потока связи в поток gui. Каким должен быть правильный способ? Я знаю, как передать данные обратно вызывающему потоку, когда дочерний поток завершил работу, но в этом случае поток связи работает все время.

Конечно логика связи представлена ​​отдельным классом (CANManager).

У меня есть пара моих собственных идей, однако я хотел бы знать, что такое «правильный» способ, как это сделать.

Заранее спасибо :)

+0

* Однако какой должен быть правильный способ? * Возможный дубликат https://www.google.com.au/search?q=wpf+invoke+on+main+thread –

+0

Посмотрите на BackgroundWorker, где вы можете использовать событие «ProgressChanged»: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.progresschanged(v=vs.110).aspx | Когда вы используете .NET 4.5, вы также можете использовать класс Task, который позволяет вам продолжить с тем же процессом, как только завершится ваш дочерний процесс: http://msdn.microsoft.com/en-us/library/dd270696 (v = vs.110) .aspx –

+0

Моя первоначальная идея состояла в том, чтобы создать «класс хранения», который будет содержать все необходимые значения в качестве свойств. поэтому я мог бы асинхронно обновлять эти свойства из моего потока связи, а затем просто привязывать эти свойства к wpf. :) – xnonamex

ответ

3

Вообще на любом языке программирования вы должны рассмотреть паб-суб архитектуру для связи между потоками. Это означает, что для каждого потока A, который хочет отправить сообщение в поток B, вы должны отправить сообщение или событие из этого потока в очередь, чтобы потреблять другой поток, когда он свободен. Если вы просто Google 'Cross Thread communication c#', вы найдете множество статей для чтения.

В частности, в .NET способ вызова метода или делегирования на другой (любой) поток - использовать SynchronizationContext. Это характерно как для Windows Forms, так и для WPF, тогда как WPF имеет диспетчер, который отличается от этой структуры, чтобы ссылаться только на поток пользовательского интерфейса.

Существует множество рамок, библиотек, шаблонов, доступных для выполнения этой техники. Один из них - Task Parallel Library. TPL позволяет создать задачу или задачу и вызывать ее в поточном пуле, пользовательском интерфейсе, том же или конкретном потоке. TPL разрешает сортировку потоков с использованием Schedulers. Вы можете использовать встроенные планировщики или создавать свои собственные. Планировщики используют SynchronizationContext в своем сердце, чтобы выполнить сортировку потоков.

Одним из особенно интересных шаблонов TPL является возможность запуска делегата в одном потоке, а затем объединение нескольких операций в другие потоки, например. по завершении или по ошибке. Я бы посмотрел на Task Asynchronous Pattern и рассмотрел вопрос о возврате задачи из асинхронных методов, чтобы вы могли chain on them using ContinueWith.

Смежные вопросы