2009-04-02 4 views

ответ

4

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

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

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

0

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

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

0

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

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

Но зачем вы это хотите?

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