我正在尝试在后台任务运行时更新主窗体中的进度条。
我正在使用最新模式&中的EventAggregator。实践发布路由我的应用程序范围事件。
我正在从类中触发事件来侦听BackgroundWorker事件,而不是像这样触发事件:
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
。它为空,没有任何东西被解雇。
我做错了什么?请指教。
答案 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选项,并且工作正常。