เนื่องจากInvoke
/ BeginInvoke
accepts Delegate
(แทนที่จะเป็นผู้รับมอบสิทธิ์ที่พิมพ์) คุณต้องบอกคอมไพเลอร์ว่าผู้รับมอบสิทธิ์ประเภทใดที่จะสร้าง MethodInvoker
(2.0) หรือAction
(3.5) เป็นตัวเลือกทั่วไป (โปรดทราบว่ามีลายเซ็นเดียวกัน) ชอบมาก:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
หากคุณต้องการส่งผ่านพารามิเตอร์ "จับตัวแปร" เป็นวิธี:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(ข้อแม้: คุณจะต้องระมัดระวังนิดถ้าใช้จับasyncแต่ซิงค์ดี - คือข้างต้นเป็นดี)
ตัวเลือกอื่นคือการเขียนวิธีการขยาย:
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
คลาสฐาน