13

WPF アプリのメイン スレッドでこのコードを実行したいのですが、何が問題なのかわかりません。

private void AddLog(string logItem)
        {

            this.Dispatcher.BeginInvoke(
                delegate()
                    {
                        this.Log.Add(new KeyValuePair<string, string>(DateTime.Now.ToLongTimeString(), logItem));

                    });
        }
4

2 に答える 2

23

匿名関数 (ラムダ式と匿名メソッド) は特定のデリゲート型に変換する必要がありDispatcher.BeginInvokeますが、 Delegate. これには2つのオプションがあります...

  1. 引き続き既存のBeginInvoke呼び出しを使用しますが、デリゲート タイプを指定します。ここにはさまざまなアプローチがありますが、私は通常、無名関数を前のステートメントに抽出します。

    Action action = delegate() { 
         this.Log.Add(...);
    };
    Dispatcher.BeginInvoke(action);
    
  2. の代わりにDispatcher取る拡張メソッドを作成します。ActionDelegate

    public static void BeginInvokeAction(this Dispatcher dispatcher,
                                         Action action) 
    {
        Dispatcher.BeginInvoke(action);
    }
    

    次に、暗黙的な変換で拡張メソッドを呼び出すことができます

    this.Dispatcher.BeginInvokeAction(
            delegate()
            {
                this.Log.Add(...);
            });
    

一般に、匿名メソッドの代わりにラムダ式を使用することもお勧めします。

Dispatcher.BeginInvokeAction(() => this.Log.Add(...));

編集:コメントに記載されているようにDispatcher.BeginInvoke、.NET 4.5 でオーバーロードがAction直接取得されるため、その場合は拡張メソッドは必要ありません。

于 2013-04-10T20:39:15.507 に答える