2011-02-08 29 views
64

Tôi đang cố gắng gọi System.Windows.Threading.Dispatcher.BeginInvoke. Chữ ký của phương thức là:Dispatcher.BeginInvoke: Không thể chuyển đổi lambda thành System.Delegate

BeginInvoke(Delegate method, params object[] args) 

Tôi đang cố chuyển nó thành Lambda thay vì phải tạo Đại biểu.

_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this }); 

Nó cho tôi lỗi trình biên dịch nói rằng tôi không thể chuyển đổi lambda thành System.Delegate. Chữ ký của đại biểu lấy một đối tượng làm tham số và trả về void. Lambda của tôi phù hợp với điều này, nhưng nó không hoạt động. Tôi đang thiếu gì?

Trả lời

60

Vì phương thức mất System.Delegate, bạn cần cung cấp cho nó một loại đại biểu cụ thể, được khai báo như vậy. Điều này có thể được thực hiện thông qua một dàn diễn viên hay một sáng tạo của các đại biểu xác định bằng DelegateType mới như sau:

_dispatcher.BeginInvoke(
    new Action<MyClass>((sender) => { DoSomething(); }), 
    new object[] { this } 
); 

Ngoài ra, như SLaks points out, Dispatcher.BeginInvoke mất một mảng params, vì vậy bạn chỉ có thể viết:

_dispatcher.BeginInvoke(
    new Action<MyClass>((sender) => { DoSomething(); }), 
    this 
); 

Hoặc, nếu DoSomething là một phương pháp trên đối tượng này chính nó:

_dispatcher.BeginInvoke(new Action(this.DoSomething)); 
+0

Đó là một 'mảng params'. – SLaks

+3

Nhưng không (x) => {DoSomething(); } khớp với chữ ký của người được ủy quyền? Tôi nghĩ đó là tất cả những gì tôi cần phải ghi rõ. – Micah

+0

@Micah: System.Delegate không có chữ ký - tất cả chỉ là "bất kỳ đại biểu nào". Bạn cần phải cung cấp cho nó một loại đại biểu với một sig. phù hợp với cách sử dụng của bạn. –

59

ngắn:

_dispatcher.BeginInvoke((Action)(() => DoSomething())); 
+8

Thậm chí ngắn hơn: Tôi không nghĩ bạn cần niềng răng {} và dấu chấm phẩy xung quanh biểu thức. – sp3ctum

+3

Bạn thậm chí không cần(), vì vậy nó có thể là '_dispatcher.BeginInvoke ((Hành động) (DoSomething)); ' – mycroes

5

Nếu bạn tham khảo System.Windows.Presentation.dll từ dự án của bạn và thêm using System.Windows.Threading thì bạn có thể truy cập một phương pháp mở rộng cho phép bạn sử dụng cú pháp lambda.

using System.Windows.Threading; 

... 

Dispatcher.BeginInvoke(() => 
{ 
}); 
+0

Tôi không thể làm việc này. Bạn có thể đi một chút chi tiết hơn? –

+0

Tôi đã thêm một ví dụ đơn giản.Hãy nhớ tham khảo System.Windows.Presentation.dll –

+0

Đó chính xác là những gì tôi nhưng bây giờ nó hoạt động ... lạ. Có lẽ tôi đã làm điều gì đó sai trái lần trước. –

5

Sử dụng Inline Lambda ...

Dispatcher.BeginInvoke((Action)(()=>{ 
    //Write Code Here 
})); 
Các vấn đề liên quan