Поскольку 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;});
(предостережение: вам нужно быть немного осторожным при использовании асинхронных захватов , но синхронизация в порядке - то есть вышеупомянутое в порядке)
Другой вариант - написать метод расширения:
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
базовом классе.