C # Синхронизировать два объекта через события - PullRequest
3 голосов
/ 03 апреля 2009

У меня есть 2 объекта. Фу и Бар в двух разных темах. Теперь я хочу вызвать событие в Foo, но в ветке Bar.

и как я могу использовать SynchronizationContext.Current для этого?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2009

Ни "Foo", ни "Bar" на самом деле не имеют потоков ... вам понадобится внешний механизм доставки сообщений для передачи сообщений между потоками, как это предусмотрено в winforms (Control.Invoke) и WPF (Dispatcher). В качестве альтернативы, что-то вроде (синхронизированной) очереди производителя / потребителя будет достаточно , если , вы не возражаете против одного из потоков, посвященных ожиданию (пассивно) сообщений.

Если вы не написали свой собственный контекст синхронизации, мы не сможем сказать, что будет Synchronization.Current; во многих случаях это null.

Можете ли вы добавить больше контекста к проблеме?

0 голосов
/ 03 апреля 2009

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

... Перед запуском Foo в Bar создайте экземпляр некоторого элемента пользовательского интерфейса, скажем, метку ... Затем, когда событие вызывается в Foo, в обработчике событий вызовите BeginInvoke () для этого элемента пользовательского интерфейса, Это гарантирует, что код, который запускается, будет запущен на Bar ...

Но ПОЧЕМУ вы хотите это сделать?

0 голосов
/ 03 апреля 2009

Контекст синхронизации больше используется для приложений Silverlight, не так ли? Если вам нужны разные операции для запуска в одном потоке, запускайте каждую операцию с помощью SynchronizationContext.Send ().

(надеюсь, что когда вы говорите, что хотите запустить его в потоке Bar, вы ссылаетесь на поток пользовательского интерфейса, в котором контекст синхронизации будет выполнять любые обратные вызовы Send () d. Событие от Foo должно быть Send () d).

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