因爲Invoke
/BeginInvoke
接受Delegate
(而不是一個類型的代表),你需要告訴編譯器什麼類型的委託創建的; (2.0)或Action
(3.5)是常用選項(注意它們具有相同的簽名);像這樣:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
如果您需要在參數中傳遞,然後在「捕捉變量」的方式:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(警告:你需要有點謹慎,如果使用捕獲異步但同步是精 - 即上面是細)
另一種選擇是寫一個擴展方法:
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
基類。
怎樣才能我在這個答案中傳遞參數給你的第一個解決方案?我的意思是這個解決方案:control.Invoke((MethodInvoker)delegate {this.Text =「Hi」;}); – uzay95 2009-11-26 14:05:56