Поскольку Invoke
/ BeginInvoke
принимает Delegate
(а не типизированный делегат), вам необходимо указать компилятору, какой тип делегата создать; MethodInvoker
(2.0) или Action
(3.5) являются распространенными вариантами (обратите внимание, что они имеют одинаковую подпись); вот так:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Если вам нужно передать параметры, то «захваченные переменные» - это путь:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(предостережение: вам нужно быть немного осторожнее, если используете перехваты 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
.