Çünkü Invoke/ BeginInvokekabul 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 Formtemel sınıfta yapabilirsiniz.