将Application.Current.Dispatcher用于调度程序线程之外的事件

时间:2017-06-25 01:51:12

标签: c# wpf multithreading

问题:应该" Application.Current.Dispatcher.Invoke"是在工作线程中引发事件还是在处理事件的UI代码中?它可以正常工作,但更好的做法或差异是什么?

在创建新闻自动收报机的WPF应用程序中,我通过Microsoft.Office.Interop.OutlookItemAdd事件从新的收件箱电子邮件中检索正文文本,然后引发传递正文文本的事件。主视图模型按如下方式订阅此事件。在OutlookReader班级:

private void OnEmailFoundWithSubjectMatchingFilter(_MailItem item)
{
    System.Windows.Application.Current.Dispatcher.Invoke(() =>
    {
        FoundEmailWithSubjectMatchingFilter?.Invoke(this, item.Body);
    });
}

而且,在MainViewModel课程中:

private void HandleEmailFeed(object sender, string e)
{
    //Application.Current.Dispatcher.Invoke(() =>
    //{
    var parser = new MailBodyParser();

    AddFeedItem(parser.Parse(e));
    //});
}

1 个答案:

答案 0 :(得分:0)

  

应该将“Application.Current.Dispatcher.Invoke”放入工作线程引发事件还是处理事件的UI代码中?

后者我会说。主要是因为工作线程可以在不知道任何System.Windows.Application对象的类库中启动。

因此工作线程应该简单地引发事件,然后客户端应用程序只负责更新最初创建它们的调度程序线程上的UI元素。类库不应该关心甚至不了解任何调度程序。