У меня есть 2 объекта. Foo и Bar в двух разных потоках. Теперь я хочу поднять событие в Foo, но в потоке Bar.C# Синхронизировать два объекта через события
и как я могу использовать SynchronizationContext.Current для этого?
У меня есть 2 объекта. Foo и Bar в двух разных потоках. Теперь я хочу поднять событие в Foo, но в потоке Bar.C# Синхронизировать два объекта через события
и как я могу использовать SynchronizationContext.Current для этого?
Ни у кого «Foo», ни «Bar» действительно нет нитей ... вам понадобится внешний механизм сообщений-сообщений для передачи сообщений между потоками, например, в winforms (Control.Invoke) и WPF (Dispatcher). В качестве альтернативы, что-то вроде (синхронизированной) очереди производителей/потребителей будет достаточно , если вы не против, чтобы один из потоков был посвящен ожиданию (пассивно) сообщений.
Если вы не написали свой собственный синхронный контекст, нам нельзя сказать, что такое Synchronization.Current
; во многих случаях это null
.
Можете ли вы добавить еще один контекст к проблеме?
Контекст синхронизации используется больше для приложений Silverlight, не так ли? Если вам нужны разные операции для запуска в одном потоке, запустите каждую операцию с помощью SynchronizationContext.Send().
(надеюсь, что когда вы скажете, что хотите запустить его в потоке Bar, вы ссылаетесь на поток пользовательского интерфейса, который в контексте синхронизации запускает любые обратные вызовы Send() d. Если это так, то только событие от Foo должно быть Send() d).
Единственный способ, с помощью которого я могу думать, это использовать методы InvokeRequired() и BeginInvoke(), встроенные в элементы интерфейса, чтобы помочь вам убедиться, что весь код, изменяющий элемент пользовательского интерфейса, выполняется из того же потока, который используется для создания элемент.
... Перед тем, как Foo запускает в Bar, создайте экземпляр некоторого элемента UI, скажем метку ... Затем Когда событие возникает в Foo, в обработчике события вызовите BeginInvoke() на этом элементе пользовательского интерфейса , Это гарантирует, что код, который запускается, будет работать на баре ...
Но зачем вы это хотите?