Como Invoke
/ BeginInvoke
aceita Delegate
(em vez de um delegado digitado), você precisa informar ao compilador que tipo de delegado criar; MethodInvoker
(2.0) ou Action
(3.5) são escolhas comuns (observe que elas têm a mesma assinatura); igual a:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Se você precisar passar parâmetros, "variáveis capturadas" são as seguintes:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(ressalva: você precisa ser um pouco cauteloso se usar capturas assíncronas , mas sincronize é boa - ou seja, o acima é bom)
Outra opção é escrever um método de extensão:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
então:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Obviamente, você pode fazer o mesmo com BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Se você não pode usar o C # 3.0, pode fazer o mesmo com um método de instância regular, presumivelmente em uma Form
classe base.