我有2个物体。 Foo和Bar在两个不同的线程中。现在我想在Foo中引发一个事件,但是在Bar的主题中。
如何为此使用SynchronizationContext.Current?
答案 0 :(得分:4)
“Foo”和“Bar”都没有线程......您需要一个外部消息泵机制来在线程之间推送消息,例如winforms(Control.Invoke)和WPF(Dispatcher)中提供的消息。或者,像(同步)生产者/消费者队列这样的东西就足够了如果你不介意其中一个线程专门用于等待(被动地)消息。
除非您已经编写了自己的同步上下文,否则我们无法说出Synchronization.Current
将会是什么;在许多情况下,它是null
。
您可以为问题添加更多上下文吗?
答案 1 :(得分:0)
同步上下文更多地用于Silverlight应用程序,不是吗?如果您需要在同一个线程中运行不同的操作,请使用SynchronizationContext.Send()启动每个操作。
(希望当你说你想在Bar的线程中运行它时,你所指的是同步上下文将运行任何Send()d回调的UI线程。如果是这样的话,只有来自Foo的事件需要是Send()d)。
答案 2 :(得分:0)
我能想到的唯一方法是使用内置于UI元素的InvokeRequired()和BeginInvoke()方法来帮助您确保修改UI元素的所有代码都是从用于创建UI元素的同一个线程中执行的。元件。
...在Foo启动之前,在Bar中,创建一个UI元素的实例,比如一个标签...然后当在Foo中引发事件时,在事件处理程序中,在该UI元素上调用BeginInvoke(),这将保证运行的代码将在Bar ...
上运行但你想做什么?