在希望在Control.Invoke内匿名调用委托的语法方面有一些问题.
我们try 了许多不同的方法,但都没有成功.
例如:
myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });
其中someParameter是此方法的局部参数
上述情况将导致编译器错误:
无法将匿名方法转换为"System"类型."委托",因为它不是委托类型
在希望在Control.Invoke内匿名调用委托的语法方面有一些问题.
我们try 了许多不同的方法,但都没有成功.
例如:
myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });
其中someParameter是此方法的局部参数
上述情况将导致编译器错误:
无法将匿名方法转换为"System"类型."委托",因为它不是委托类型
因为Invoke
/BeginInvoke
接受Delegate
(而不是类型化委托),所以您需要告诉编译器要创建哪种类型的委托;MethodInvoker
(2.0)或Action
(3.5)是常见的 Select (请注意,它们具有相同的签名);如下所示:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
如果您需要传入参数,那么"捕获变量"是一种方法:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(警告:如果使用captures async,你需要谨慎一点,但是sync是可以的——也就是说,上面的选项是可以的)
另一种 Select 是编写扩展方法:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
然后:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
当然,你也可以用BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
如果你不能使用C#3.0,你可以用一个普通的实例方法来做同样的事情,大概是在Form
个基类中.