Các hàm ẩn danh (biểu thức lambda và các phương thức ẩn danh) phải được chuyển đổi thành loại cụ thể ủy quyền, trong khi Dispatcher.BeginInvoke
chỉ cần Delegate
. Có hai lựa chọn cho điều này ...
Tuy nhiên sử dụng BeginInvoke
gọi hiện có, nhưng rõ loại đại biểu. Có nhiều cách tiếp cận khác nhau ở đây, nhưng tôi thường trích xuất các chức năng ẩn danh một tuyên bố trước đó:
Action action = delegate() {
this.Log.Add(...);
};
Dispatcher.BeginInvoke(action);
Viết một phương pháp khuyến nông trên Dispatcher
mà mất Action
thay vì Delegate
:
public static void BeginInvokeAction(this Dispatcher dispatcher,
Action action)
{
Dispatcher.BeginInvoke(action);
}
Sau đó, bạn có thể gọi phương pháp mở rộng với chuyển đổi tiềm ẩn
this.Dispatcher.BeginInvokeAction(
delegate()
{
this.Log.Add(...);
});
Tôi cũng khuyến khích bạn sử dụng biểu thức lambda thay vì phương pháp mang tính chất nói chung:
Dispatcher.BeginInvokeAction(() => this.Log.Add(...));
EDIT: Như đã nêu trong các ý kiến, Dispatcher.BeginInvoke
đạt được một tình trạng quá tải trong .NET 4.5 mà phải mất một Action
trực tiếp, vì vậy bạn không cần phương thức mở rộng trong trường hợp đó.
Nguồn
2013-04-10 20:39:15
Hãy xem ở đây http://stackoverflow.com/questions/4936459/dispatcher-begininvoke-cannot-convert-lambda-to-system-delegate – MethodMan