beginInvoke,GUI和线程

时间:2011-06-07 16:08:10

标签: c# begininvoke

我有两个线程的应用程序。其中一个(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();
    }
 }

但是现在我必须宣布两个功能。它如何只使用一个功能?或者它是怎么回事。

2 个答案:

答案 0 :(得分: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);         
}

答案 1 :(得分:3)

对我来说很好看。您可以将匿名委托更改为lambda,这有点清晰。要删除f()方法声明,可以将其代码内联到委托中,然后将委托作为MethodInvoker调用,或者像调用其他任何方法一样调用它:

 public void FUNCTION() {

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

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