Karena Invoke
/ BeginInvoke
menerima Delegate
(daripada delegasi yang diketik), Anda perlu memberi tahu kompiler jenis delegasi yang akan dibuat; MethodInvoker
(2.0) atau Action
(3.5) adalah pilihan umum (perhatikan bahwa mereka memiliki tanda tangan yang sama); seperti itu:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Jika Anda perlu memasukkan parameter, maka "variabel yang ditangkap" adalah caranya:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(peringatan: Anda perlu sedikit berhati-hati jika menggunakan menangkap async , tetapi sinkronisasi baik-baik saja - yaitu di atas baik-baik saja)
Pilihan lain adalah menulis metode ekstensi:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
kemudian:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Anda tentu saja dapat melakukan hal yang sama dengan BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Jika Anda tidak dapat menggunakan C # 3.0, Anda bisa melakukan hal yang sama dengan metode instance biasa, mungkin di Form
kelas dasar.