簡體   English   中英

如何正確使用Dispatcher.BeginInvoke?

[英]How do I use Dispatcher.BeginInvoke properly?

我幾乎到處搜索互聯網,我搜索了很多次,發現了很多結果,但我仍然無法找到問題的解決方案。

我正忙着將舊的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);

這就是你知道它何時完成的方式 - 它將通過該事件回電給你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM