代码之家  ›  专栏  ›  技术社区  ›  Tomas Pajonk

我应该如何从P&P为EventAggregator创建事件,以便UI线程上的订阅者可以监听它们?

  •  2
  • Tomas Pajonk  · 技术社区  · 16 年前

    我正在尝试在后台任务运行时更新主窗体中的进度条。

    我正在使用最新的模式和实践发布路线的事件聚合器,我的应用程序范围的事件。

    我正在从类中激发一个事件来侦听后台工作者事件,而不是像这样激发一个事件:

    1. BW过程触发BW方法 报告进度。
    2. BW开火了 报告事件。
    3. 他们被选中了 通过somecommand类方法 之前在BW上设置的 推出。
    4. 我从发布事件 事件聚合器

    public void progresschanged(对象发送方,progresschangedeventargs ea) { knowProgressStateusChangedEvent evt=kernelKeeper.kernel.get().getEvent(); evt.发布(ea); }

    我的主要演示者已订阅这些事件,例如:

        KnownProgressStatusChangedEvent progressChanged = EventAggregator.GetEvent<KnownProgressStatusChangedEvent>();
        progressChanged.Subscribe(KnownProgressChanged,ThreadOption.UIThread);
    

    如果我不设置threappression.uithread,我将在没有堆栈跟踪的program.cs中获得targetInvokationException。 这样,我就不例外了,我可以加入EventAggregator。

    当它将要调用KnownProgressChanged方法时,它试图调用它并检查 Application.Current != null . 它是空的,没有任何东西被激发。

    我做错什么了?请告知。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Guillaume    16 年前

    必须指定threappression.ui thread,因为要处理进度条,必须从UI线程调用处理程序才能绘制新的进度状态。

    howeserver如果使用wpf,则必须在不使用threadpassoction.uithread和 dispatch 打电话给你自己,你可以看看作曲的温度。

    Event Aggregator -订阅用户界面线程

    通常,订户需要 更新中的用户界面元素 对事件的响应。在Windows中 演示文稿基金会(WPF),只有一个 用户界面线程可以更新用户界面 元素。默认情况下,订阅服务器 接收发布服务器上的事件 线程,因此如果发布服务器发送 来自UI线程的事件, 订阅服务器将能够更新 用户界面。

    但是,如果发布者的线程是 后台线程,订阅服务器 可能无法直接更新用户 接口元素。相反,它会 需要在UI上安排更新 使用Windows演示文稿线程 基金会的分派类。这个 复合材料提供 复合应用程序库can 通过允许用户 在上自动接收事件 UI线程。订户必须 在订阅过程中指出这一点,如 显示在以下代码中。

        2
  •  1
  •   Tomas Pajonk    16 年前

    TargetInvocationException是一个红鲱鱼,它是我在代码的其他地方抛出一个未实现的异常所导致的。

    我使用的是WinForms,并使用了带有threappression.publisherThread选项的订阅,这很好。

    推荐文章