6

我有两个线程的应用程序。其中一个 (T1) 是主要的 GUI 形式,另一个 (T2) 是循环工作的函数。当 T2 得到一些信息时,必须以 GUI 形式调用函数。我不确定我做对了。

T2 调用函数 FUNCTION,以 GUI 形式更新某些内容。

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


 public void FUNCTION() {

    MethodInvoker method = delegate {
            f();
    };

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

但现在我必须声明两个函数。它如何只使用一个功能?或者如何正确。

4

2 回答 2

16

您可以通过调用自己的方法在单个方法中执行此操作:

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

     // controller.DoSomething();         
}

根据评论进行编辑:

如果您需要传递其他参数,可以使用 lambda 表达式来完成,如下所示:

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

在我看来很好。您也许可以将匿名委托更改为更简洁的 lambda。要摆脱 f() 方法声明,您可以将其代码内联到委托中,然后将委托作为 MethodInvoker 调用,或者像调用任何其他方法一样简单地调用它:

 public void FUNCTION() {

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

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