Debido Invoke
/BeginInvoke
acepta Delegate
(en lugar de un delegado mecanografiado), es necesario indicar al compilador qué tipo de delegado para crear; MethodInvoker
(2.0) o Action
(3.5) son opciones comunes (tenga en cuenta que tienen la misma firma); de este modo:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Si tiene que pasar en los parámetros, las "variables capturados" son, pues, el camino:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(advertencia: tiene que ser un poco prudente si se utiliza capturas asíncrono , pero sincronización está bien - es decir, la anterior es 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);
}
a continuación:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Por supuesto, puede hacer lo mismo con BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Si no puede utilizar C# 3.0, se podría hacer lo mismo con un método de instancia regulares , presumiblemente en una clase base Form
.
¿Cómo puede Paso parámetros a su primera solución en esta respuesta? Quise decir esta solución: control.Invoke ((MethodInvoker) delegate {this.Text = "Hi";}); – uzay95
¿Por qué se invoca el método de extensión sin tener que realizar un lanzamiento explícito a la acción? –
Porque el compilador puede inferir eso del uso. – RoboJ1M