如何正确使用Dispatcher.BeginInvoke?

我几乎到处搜索互联网,我搜索了很多次,发现了很多结果,但我仍然无法找到问题的解决方案。

我正忙着将旧的WinForms应用程序转换为新的WPF应用程序,但我遇到了一些命令的问题。 在Winforms应用程序中,他们使用Control.BeginInvoke()并将其存储在IAsyncResult对象中。 我已经读过Dispatcher.BeginInvoke()是与WinFormsControl.BeginInvoke()相当的WPF但我在使用时遇到此错误

Dispatcher.BeginInvoke():“无法将类型’System.Windows.Threading.DispatcherOperation’隐式转换为’System.IAsyncResult’。存在显式转换(您是否错过了转换?)”。

任何帮助将不胜感激。

这是我试图转换的代码。 这是最初的WinForms代码。 我可以转换除BeginInvoke部分之外的所有内容。

  private eSkan.api.TeSkanAPI feSkanAPI = null; private void MessageFilter_AddRemove_Invoked(bool AddFilter, IMessageFilter Filter) { if (AddFilter){ Application.AddMessageFilter(Filter); } else { Application.RemoveMessageFilter(Filter); } } private void MessageFilter_AddRemove(bool AddFilter, IMessageFilter Filter) { { IAsyncResult sr = BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, AddFilter, Filter); sr.AsyncWaitHandle.WaitOne(2000); } } 

下面是我到目前为止转换的代码,包括我正在努力的BeginInvoke部分。

  private void MessageFilter_AddRemove_Invoked(bool addFilter, System.Windows.Forms.IMessageFilter filter) { if (addFilter) { System.Windows.Forms.Application.AddMessageFilter(filter); } else { System.Windows.Forms.Application.RemoveMessageFilter(filter); } } private void MessageFilter_AddRemove(bool addFilter, System.Windows.Forms.IMessageFilter filter) { { IAsyncResult sr = System.Windows.Threading.Dispatcher.BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, addFilter, filter); sr.AsyncWaitHandle.WaitOne(2000); } } 

如果有任何其他错误,请告诉我。

谢谢

这是因为Dispatcher.BeginInvoke虽然可能是等效的逻辑操作,但不返回IAsyncResult ,它返回DispatcherOperation 。 看一下这篇博客文章 ,您将看到Dispatcher如何工作的一个很好的例子。 我已将相关代码示例复制到此处以确保它稍后存在。

 public Window1() { InitializeComponent(); CheckBox myCheckBox = new CheckBox(); myCheckBox.Content = "A Checkbox"; System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart( delegate() { System.Windows.Threading.DispatcherOperation dispatcherOp = myCheckBox.Dispatcher.BeginInvoke( System.Windows.Threading.DispatcherPriority.Normal, new Action( delegate() { myCheckBox.IsChecked = true; } )); dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); } )); thread.Start(); } void dispatcherOp_Completed(object sender, EventArgs e) { Console.WriteLine("The checkbox has finished being updated!"); } 

注意这一行:

 dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); 

这就是你知道它何时完成的方式 – 它将通过该事件回电给你。