Como Invoke
/ BeginInvoke
acepta Delegate
(en lugar de un delegado con tipo), debe decirle al compilador qué tipo de delegado crear; MethodInvoker
(2.0) o Action
(3.5) son opciones comunes (tenga en cuenta que tienen la misma firma); al igual que:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Si necesita pasar parámetros, las "variables capturadas" son las siguientes:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(advertencia: debe ser un poco cauteloso si usa capturas asíncronas , pero la sincronización está bien, es decir, lo anterior está bien)
Otra opción es escribir un método de extensión:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
luego:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Por supuesto, puedes hacer lo mismo con BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Si no puede usar C # 3.0, puede hacer lo mismo con un método de instancia regular, presumiblemente en una Form
clase base.