Bởi vì Invoke
/ BeginInvoke
chấp nhận Delegate
(chứ không phải là một đại biểu đã gõ), bạn cần cho trình biên dịch biết loại đại biểu nào sẽ tạo; MethodInvoker
(2.0) hoặc Action
(3.5) là những lựa chọn phổ biến (lưu ý rằng chúng có cùng chữ ký); như vậy
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
Nếu bạn cần truyền tham số, thì "các biến được bắt" là cách:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(caveat: bạn cần phải có một chút thận trọng nếu sử dụng ảnh chụp async , nhưng đồng bộ là tốt - tức là ở trên là tốt)
Một tùy chọn khác là viết một phương thức mở rộng:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
sau đó:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
Tất nhiên bạn có thể làm tương tự với BeginInvoke
:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
Nếu bạn không thể sử dụng C # 3.0, bạn có thể làm tương tự với phương thức cá thể thông thường, có lẽ là trong Form
lớp cơ sở.