Çünkü Invoke
/ BeginInvoke
kabul eder Delegate
(yazılı bir temsilci yerine), derleyiciye ne tür bir temsilci oluşturacağını söylemeniz gerekir; MethodInvoker
(2.0) veya Action
(3.5) ortak seçeneklerdir (aynı imzaya sahip olduklarını unutmayın); böyle:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Parametreleri iletmeniz gerekiyorsa, "yakalanan değişkenler" şu şekilde olur:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(uyarı: eşzamansız yakalamalar kullanıyorsanız biraz dikkatli olmanız gerekir , ancak eşitleme iyidir - yani yukarıdakiler iyidir)
Diğer bir seçenek de bir uzatma yöntemi yazmaktır:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
sonra:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Elbette aynı şeyi aşağıdakilerle de yapabilirsiniz BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
C # 3.0'ı kullanamıyorsanız, aynı şeyi normal bir örnek yöntemiyle, muhtemelen Form
temel sınıfta yapabilirsiniz.