【发布时间】:2009-04-02 23:05:51
【问题描述】:
我有 2 个对象。 Foo 和 Bar 在两个不同的线程中。现在我想在 Foo 但在 Bar 的线程中引发一个事件。
我该如何使用 SynchronizationContext.Current 呢?
【问题讨论】:
标签: c# multithreading synchronization
我有 2 个对象。 Foo 和 Bar 在两个不同的线程中。现在我想在 Foo 但在 Bar 的线程中引发一个事件。
我该如何使用 SynchronizationContext.Current 呢?
【问题讨论】:
标签: c# multithreading synchronization
“Foo”和“Bar”都没有真正的线程......您需要一个外部消息泵机制来在线程之间推送消息,例如在 winforms (Control.Invoke) 和 WPF (Dispatcher) 中提供的。或者,像(同步)生产者/消费者队列之类的东西就足够了如果您不介意线程之一专门用于(被动地)等待消息。
除非您自己编写了同步上下文,否则我们不可能说出SynchronizationContext.Current 会是什么;在很多情况下是null。
您能否为问题添加更多上下文?
【讨论】:
Silverlight 应用更多地使用同步上下文,不是吗?如果您需要在同一个线程中运行不同的操作,请使用 SynchronizationContext.Send() 启动每个操作。
(希望当您说要在 Bar 的线程中运行它时,您指的是同步上下文将在其中运行任何 Send()d 回调的 UI 线程。如果是这样,只有来自 Foo 的事件需要是 Send()d)。
【讨论】:
我能想到的唯一方法是使用 UI 元素中内置的 InvokeRequired() 和 BeginInvoke() 方法来帮助您确保修改 UI 元素的所有代码都从用于创建元素。
... 在 Foo 开始之前,在 Bar 中创建某个 UI 元素的实例,比如一个标签... 然后当 Foo 中引发事件时,在事件处理程序中,对该 UI 元素调用 BeginInvoke(),这将保证运行的代码将在 Bar 上运行...
但是你为什么要这样做呢?
【讨论】: