Создание события между двумя потоками, если ни один из потоков не является WinForm - PullRequest
2 голосов
/ 31 января 2011

У меня проблемы с поиском примера на c #, который показывает, как вызвать событие перекрестного потока в следующем состоянии:

Допустим, у меня есть 1 событие и 3 темы:

Событие DoStuff

Тема A - WinForm

Нить B - Нить, порожденная из Нити A, для некоторой обработки. Имеет функцию Foo (), которая подписана на DoStuff

Поток C - Поток, порожденный из потока B для выполнения некоторой подпроцессы, и вызывает событие DoStuff

Теперь Как мне обеспечить, чтобы событие, возникшее в потоке C, обрабатывалось внутри потока B вместо C или A.

Все примеры, которые я запускаю, намекают на Form / Control.Invloke или что-то в этом роде, где я действительно хочу, чтобы любой поток, подписанный на событие, выполнялся внутри его репрезентативного потока, а не только в главной форме. Нить.

1 Ответ

4 голосов
/ 31 января 2011

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

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

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