Perché Invoke
/ BeginInvoke
accetta Delegate
(anziché un delegato tipizzato), è necessario indicare al compilatore quale tipo di delegato creare; MethodInvoker
(2.0) o Action
(3.5) sono scelte comuni (nota che hanno la stessa firma); così:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Se è necessario passare parametri, le "variabili acquisite" sono le seguenti:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(avvertenza: è necessario essere un po 'cauti se si utilizzano acquisizioni asincrone , ma la sincronizzazione va bene, ovvero quanto sopra va bene)
Un'altra opzione è quella di scrivere un metodo di estensione:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
poi:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Ovviamente puoi fare lo stesso con BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Se non puoi usare C # 3.0, puoi fare lo stesso con un metodo di istanza regolare, presumibilmente in una Form
classe base.