问题:在引发事件的工作线程中,还是在处理事件的UI代码中应该放置 "Application.Current.Dispatcher.Invoke"?两种方式都可以正常工作,但哪种更好的做法或有什么区别?
在创建新闻滚动条的WPF应用程序中,我通过Microsoft.Office.Interop.Outlook和ItemAdd事件从新收件箱电子邮件中检索正文文本,然后引发事件传递正文文本。主视图模型如下订阅此事件。在OutlookReader类中:
在创建新闻滚动条的WPF应用程序中,我通过Microsoft.Office.Interop.Outlook和ItemAdd事件从新收件箱电子邮件中检索正文文本,然后引发事件传递正文文本。主视图模型如下订阅此事件。在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));
//});
}
CheckAccess
方法:if (!Application.Current.Dispatcher.CheckAccess()) { // You should use invoke } else { // Invoke isn't required }
https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.checkaccess(v=vs.110).aspx - Kevin Gosse