4

我几乎在互联网上到处搜索,我google了很多次,找到了很多结果,但我仍然找不到我的问题的解决方案。

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

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);
        }
    }

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

谢谢

4

1 回答 1

4

那是因为Dispatcher.BeginInvoke尽管它可能是等效的逻辑运算,但它不返回 a IAsyncResult,而是返回 a 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);

这就是您将如何知道它何时完成的方式 - 它会通过该事件回电给您。

于 2013-04-10T13:00:26.873 回答