Оскільки 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 , але синхронізація нормальна - тобто вище сказано)
Ще один варіант - написати метод розширення:
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
базовому класі.