2009-07-30 3 views
1

У нас есть приложение с несколькими подсистемами, работающими в разных потоках (т. Е. Один поток контролирует GPS, другой контролирует RFID-считыватель и т. Д.). Потоки запускаются и контролируются реестром службы, который отделен от части форм выигрыша.Лучший способ обработки нескольких потоков в приложении Win Forms

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

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

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

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

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

любая помощь будет принята с благодарностью

приветствий

Нимаи

ответ

1

Вместо того, чтобы вызывать через для каждого поля, которое нужно обновить, использовать MethodInvoker делегат с BeginInvoke и вызвать метод, который делает все ваши обновления сразу. Например ...

BeginInvoke(new MethodInvoker(MyUIUpdaterMethodHere)); 
0

Вы посмотрите на Event Aggregator узор, который в основном позволяет слабосвязанной событий на основе архитектуры типа паб/суб может. Призма, структура из команды Microsoft Patterns and Practices для создания составных приложений с WPF и Silverlight, включает агрегацию событий, которая позволяет различным компонентам пользовательского интерфейса взаимодействовать друг с другом по-слабому, аналогично вашей цели дизайна. Вы можете взглянуть на него и попытаться использовать только часть агрегации событий. Если нет, у вас есть доступ к исходному коду, чтобы вы могли создавать что-то, что соответствует вашим требованиям.

0

Вы можете использовать Windows Forms Synchronization Context для передачи в SendOrPostCallBackDelegate (или лямбда), который, в свою очередь, может обновлять несколько элементов управления поточно-безопасным способом.

Похоже, что эти подсистемы работают как служба Windows. Как ваше приложение winform общается с этими подсистемами.

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