1

現在、名前付きパイプから非同期的にデータを受信する Windows フォームがあります。「クロス スレッド操作が無効です: コントロール 'myTextBox' は、それが作成されたスレッド以外のスレッドからアクセスされました」というメッセージが表示されないようにするために、匿名メソッドを使用しています ( http://www.codeproject.com/Articles/28485/を参照)。初心者ガイドからネットへのスレッド化 - Part-of-n ):

            // Pass message back to calling form
            if (this.InvokeRequired)
            {
                // Create and invoke an anonymous method
                this.Invoke(new EventHandler(delegate
                {
                    myTextBox.Text = stringData;
                }));
            }
            else
                myTextBox.Text = stringData;

私の質問は、「new EventHandler(delegate」行は何をしますか?デリゲートのデリゲートを作成しますか?代わりに名前付きデリゲートを使用して上記の機能をどのように実装するかを説明してもらえますか?(理解を助けるためだけに) ? ティア。

4

1 に答える 1

3

C++ のバックグラウンドがある場合は、デリゲートを関数への単純なポインターとして説明します。デリゲートは、関数ポインターを安全に処理する .NET の方法です。

名前付きデリゲートを使用するには、まずイベントを処理する関数を作成する必要があります。

void MyHandler(object sender, EventArgs e)
{
    //Do what you want here
}

次に、以前のコードを次のように変更します。

this.Invoke(new EventHandler(MyHandler), this, EventArgs.Empty);

ただし、これを行う場合は、コードの重複を避けるために次のように記述します。

EventHandler handler = (sender, e) => myTextBox.Test = stringData;

if (this.InvokeRequired)
{
    this.Invoke(handler, this, EventArgs.Empty);  //Invoke the handler on the UI thread
}
else
{
    handler(this, EventArgs.Empty); //Invoke the handler on this thread, since we're already on the UI thread.
}
于 2014-05-01T22:34:59.110 に答える