我有两个线程的应用程序。其中一个(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();
}
}
但是现在我必须宣布两个功能。它如何只使用一个功能?或者它是怎么回事。
答案 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();
}
}