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

时间:2009-11-19 16:57:32

标签: c# eventaggregator

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

我正在使用最新模式&中的EventAggregator。实践发布路由我的应用程序范围事件。

我正在从类中触发事件来侦听BackgroundWorker事件,而不是像这样触发事件:

  1. bw上的进程触发BW方法 报告进展情况。
  2. BW发射它 举报活动。
  3. 他们被选中了 通过SomeCommand类方法 在它之前就已经在BW上了 启动。
  4. 我发布了来自的活动 EventAggregator
  5. public void ProgressChanged(object sender,ProgressChangedEventArgs ea)     {         KnownProgressStatusChangedEvent evt = KernelKeeper.Kernel.Get()。GetEvent();         evt.Publish(EA);     }

    我的MainPresenter已经订阅了这些事件:

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

    如果我没有设置ThreadOption.UIThread,我在Program.cs中得到TargetInvokationException而没有堆栈跟踪。 这样我就不会有异常,我可以进入EventAggregator。

    当它要调用KnownProgressChanged方法时,它会尝试调用它并检查Application.Current != null。它为空,没有任何东西被解雇。

    我做错了什么?请指教。

2 个答案:

答案 0 :(得分:2)

您必须指定ThreadOption.UIThread,因为您正在处理进度条,必须从ui线程调用处理程序才能绘制新的进度状态。

如果您正在使用WPF,则必须在没有ThreadOption.UIThread和dispatch调用的情况下处理它,您可以查看CompositeWpfEvent。

请参阅Event Aggregator - 订阅用户界面线程

  

订阅者通常需要这样做   更新用户界面元素   对事件的回应。在Windows中   Presentation Foundation(WPF),只有一个   UI线程可以更新用户界面   元素。默认情况下,订户   收到发布者的活动   线程,所以如果发布者发送   来自UI线程的事件,   订阅者将能够更新   用户界面。

     

但是,如果发布者的主题是   后台线程,订户   可能无法直接更新用户   界面元素。相反,它会   需要在UI上安排更新   使用Windows演示文稿的线程   Foundation的Dispatcher类。该   CompositeWpfEvent提供了   复合应用程序库可以   通过允许订户协助   自动接收事件   UI线程。订户必须   在订阅期间表明这一点,如   如下代码所示。

     

...

答案 1 :(得分:1)

TargetInvocationException是一个红色的鲱鱼,我在我的代码中的其他地方抛出了一个未实现的异常。

我正在使用WinForms并使用订阅与ThreadOption.PublisherThread选项,并且工作正常。