在想要在Control.Invoke中匿名调用委托的语法上有麻烦。
我们尝试了许多不同的方法,但都无济于事。
例如:
myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });
其中someParameter在此方法本地
以上将导致编译器错误:
无法将匿名方法转换为类型“ System.Delegate”,因为它不是委托类型
因为Invoke/ BeginInvoke接受Delegate(而不是类型的委托),所以您需要告诉编译器要创建什么类型的委托;MethodInvoker(2.0)或Action(3.5)是常见选择(请注意,它们具有相同的签名);像这样:
Invoke
BeginInvoke
Delegate
MethodInvoker
Action
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
如果需要传递参数,则可以使用“捕获的变量”:
string message = "Hi"; control.Invoke((MethodInvoker) delegate {this.Text = message;});
(注意:如果使用captures async ,则需要谨慎一点,但是 sync 很好-即上述情况很好)
另一种选择是编写扩展方法:
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基类中)执行相同的操作。
Form