6

2スレッドのアプリケーションがあります。それらの1つ(T1)はメインGUIフォームであり、もう1つ(T2)はループで動作する関数です。T2が取得するとき、いくつかの情報はGUIフォームで関数を呼び出す必要があります。私はそれを正しく行うかどうかわかりません。

T2は関数FUNCTIONを呼び出します。これは、GUI形式で何かを更新します。

  public void f() {
        // controler.doSomething();
  }


 public void FUNCTION() {

    MethodInvoker method = delegate {
            f();
    };

    if ( InvokeRequired ) {
        BeginInvoke( method );
    } else {
            f();
    }
 }

しかし今、私は2つの関数を宣言する必要があります。1つの関数だけを使用するにはどうすればよいですか?またはそれはどのように正しいのですか。

4

2 に答える 2

16

自分でinvokingを呼び出すことにより、単一のメソッドでこれを行うことができます。

public void Function()
{
     if (this.InvokeRequired)
     {
         this.BeginInvoke(new Action(this.Function));
         return;
     }

     // controller.DoSomething();         
}

コメントに応じて編集します。

追加の引数を渡す必要がある場合は、次のようにラムダ式を使用して渡すことができます。

public void Function2(int someValue)
{
     if (this.InvokeRequired)
     {
         this.BeginInvoke(new Action(() => this.Function2(someValue)));
         return;
     }

     // controller.DoSomething(someValue);         
}
于 2011-06-07T16:13:09.517 に答える
3

は、私にはよく見えますよ。匿名のデリゲートをラムダに変更できる場合があります。これは少しクリーンです。f()メソッド宣言を取り除くには、そのコードをデリゲートにインライン化してから、デリゲートをMethodInvokerとして呼び出すか、他のメソッドと同じように呼び出すことができます。

 public void FUNCTION() {

    MethodInvoker method = ()=> controller.doSomething();

    if ( InvokeRequired ) {
        BeginInvoke( method );
    } else {
            method();
    }
 }
于 2011-06-07T16:14:04.147 に答える