4

私はインターネット上のほぼすべての場所を検索し、何度もグーグルで検索して非常に多くの結果を見つけましたが、それでも問題の解決策を見つけることができません.

古いWinFormsアプリケーションを新しい WPF アプリケーションに変換するのに忙しいのですが、いくつかのコマンドで問題が発生しています。Winforms アプリケーションではControl.BeginInvoke()、これを使用して IAsyncResult オブジェクトに格納します。はforと同等であると読みましたDispatcher.BeginInvoke()が、使用するとこのエラーが発生しますWPFControl.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は、同等の論理演算である可能性がありますが、 を返さず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);

それがいつ完了したかを知る方法です。そのイベントを介してコールバックされます。

于 2013-04-10T13:00:26.873 に答える