【问题标题】:C# Synchronize two objects through eventsC#通过事件同步两个对象
【发布时间】:2009-04-02 23:05:51
【问题描述】:

我有 2 个对象。 Foo 和 Bar 在两个不同的线程中。现在我想在 Foo 但在 Bar 的线程中引发一个事件。

我该如何使用 SynchronizationContext.Current 呢?

【问题讨论】:

    标签: c# multithreading synchronization


    【解决方案1】:

    “Foo”和“Bar”都没有真正的线程......您需要一个外部消息泵机制来在线程之间推送消息,例如在 winforms (Control.Invoke) 和 WPF (Dispatcher) 中提供的。或者,像(同步)生产者/消费者队列之类的东西就足够了如果您不介意线程之一专门用于(被动地)等待消息。

    除非您自己编写了同步上下文,否则我们不可能说出SynchronizationContext.Current 会是什么;在很多情况下是null

    您能否为问题添加更多上下文?

    【讨论】:

      【解决方案2】:

      Silverlight 应用更多地使用同步上下文,不是吗?如果您需要在同一个线程中运行不同的操作,请使用 SynchronizationContext.Send() 启动每个操作。

      (希望当您说要在 Bar 的线程中运行它时,您指的是同步上下文将在其中运行任何 Send()d 回调的 UI 线程。如果是这样,只有来自 Foo 的事件需要是 Send()d)。

      【讨论】:

        【解决方案3】:

        我能想到的唯一方法是使用 UI 元素中内置的 InvokeRequired() 和 BeginInvoke() 方法来帮助您确保修改 UI 元素的所有代码都从用于创建元素。

        ... 在 Foo 开始之前,在 Bar 中创建某个 UI 元素的实例,比如一个标签... 然后当 Foo 中引发事件时,在事件处理程序中,对该 UI 元素调用 BeginInvoke(),这将保证运行的代码将在 Bar 上运行...

        但是你为什么要这样做呢?

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          • 1970-01-01
          • 2010-09-19
          相关资源
          最近更新 更多