Реактивные расширения для компонента lib. потребляется настольными приложениями и другими контекстами. - PullRequest
0 голосов
/ 04 января 2012

Я создал библиотеку компонентов, которая включает в себя класс executive , который работает с любым количеством потоков и запускает события из этих потоков.Это все хорошо.Теперь я хочу использовать своего руководителя в настольном приложении.(Winforms в первом случае, WPF позже), поэтому я хочу перенаправить все вызовы событий обратно в поток пользовательского интерфейса.Я знаю 3 способа сделать это;

  • Проверить IsInvokedRequired / вызвать Invoke в обработчиках;Это неудачное ИМО.
  • Создать декоратор для руководителя, который использует асинхронную модель базы событий;Дает мне желаемый результат, хотя и не очень захватывающий.
  • Используйте диспетчер WPF;считает неправильным использовать класс WPF в приложении Winforms.или, что еще более неправильно, использовать его в компоненте lib.

Я провел последний час или около того, читая Rx, и я думаю, что идеальным решением может быть внедрение Rx в исполнительную ипоручить исполнителю (необязательно) планировщик.Таким образом, клиент руководителя может определить поведение в отношении того, в каком потоке / ах создаются события, и я получаю все остальные качества Rx.Или, возможно, создайте RxExecutive, который использует планировщик и инкапсулирует мой существующий руководитель для обеспечения Rx API.

Я думаю по правильному пути или я упустил суть?

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Rx предоставляет очень хороший способ доступа к потоку пользовательского интерфейса в приложении Windows Forms. Вы можете использовать полную библиотеку Rx наблюдаемых, но если вам просто нужен простой способ запуска вещей в потоке пользовательского интерфейса, тогда использование ControlScheduler совсем несложно.

Предполагая, что у вас есть форма с именем form1, просто сделайте это:

var scheduler = new System.Reactive.Concurrency.ControlScheduler(form1);

scheduler.Schedule(() => { /* Do Stuff on UI thread */ });

Easy.

Вам не нужно использовать ссылку на форму - вы можете использовать любой элемент управления.

1 голос
/ 04 января 2012

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

1 голос
/ 04 января 2012

Я считаю, что предпочтительным шаблоном является планирование SynchronizationContext .SynchronizationContexts доступны как для приложений WPF, так и для приложений WinForms, используются для планирования WF4 и WCF, и я уверен, что они также используются в других частях инфраструктуры.

...