如何使用Dispatcher ?BeginInvoke正常

本文关键字:BeginInvoke 正常 Dispatcher 何使用 | 更新日期: 2023-09-27 18:08:40

我在网上几乎到处都找过了,我谷歌了很多次,找到了很多结果,但我仍然找不到解决我问题的方法。

我正忙着将旧的WinForms应用程序转换为新的WPF应用程序,但我在一些命令方面遇到了麻烦。在Winforms应用程序中,他们使用Control.BeginInvoke()并将其存储在IAsyncResult对象中。我读到Dispatcher.BeginInvoke()WPF相当于WinFormsControl.BeginInvoke(),但当我使用

时,我得到了这个错误

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正常

这是因为虽然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);

这样你就知道它什么时候完成了——它会通过那个事件回叫你