2013-01-17 33 views
10

Tôi gặp vấn đề mà tôi không thể hình dung ra, mặc dù đây là một câu hỏi tiêu chuẩn ở đây trên Stackoverflow.Không thể chuyển đổi biểu thức lambda thành loại 'System.Delegate' vì nó không phải là loại đại biểu?

Tôi đang cố gắng để cập nhật Bing Maps của tôi không đồng bộ bằng cách sử dụng đoạn mã sau (tâm trí bạn, đây là từ một dự án Silverlight cũ và dường như không làm việc trong WPF)

_map.Dispatcher.BeginInvoke(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
}); 

Tôi đang làm gì sai ?

+6

Và còn về '(Hành động) (() => ...)' thì sao? – acrilige

+0

@acrilige cảm ơn! tại sao bạn không làm điều đó như là câu trả lời ???? –

Trả lời

30

Bạn phải cast nó một cách rõ ràng để một Action để cho việc chuyển đổi để System.Delegate đá trong

Đó là :

_map.Dispatcher.BeginInvoke((Action)(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
})); 
+5

Đối với sự quan tâm của bạn, bạn có thể muốn xem nhận xét tôi đã thêm vào câu trả lời của SLaks –

13

Tham số của phương pháp BeginInvoke() là lớp cơ sở Delegate.

Bạn chỉ có thể chuyển đổi biểu thức lambda thành loại đại biểu cụ thể.

Để khắc phục vấn đề này, bạn cần phải xây dựng một cách rõ ràng đại biểu:.

BeginInvoke(new MethodInvoker(() => { ... })); 
+10

Thực tế ít được biết: nó * nhỉnh hơn * hiệu quả hơn khi sử dụng 'MethodInvoker' ở đây, thay vì' Action'/'ThreadStart', vv - mặc dù chữ ký giống hệt nhau: nó có hỗ trợ trực tiếp trong' Control.InvokeMarshaledCallbackDo' (qua 'is'/cast) - nơi mà các loại đại biểu khác sử dụng' DynamicInvoke'. Chỉ các loại ủy quyền được hỗ trợ trực tiếp khác là 'WaitCallback' và' EventHandler' –

2

Hãy thử

Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate 
{ 
//Do something 
})); 

Hoặc sử dụng Action

+4

Vì sự quan tâm của bạn, bạn có thể muốn xem nhận xét tôi đã thêm vào SLaks 'answer –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: Đại biểu có thể là một cá thể của EventHandler, trong trường hợp đó tham số người gửi sẽ chứa điều khiển này và thông số sự kiện sẽ chứa EventArgs.Empty. Đại biểu cũng có thể là một thể hiện của MethodInvoker, hoặc bất kỳ đại biểu nào khác có danh sách tham số void. Cuộc gọi đến một đại biểu EventHandler hoặc MethodInvoker sẽ nhanh hơn cuộc gọi đến một loại đại biểu khác. – Alex

Các vấn đề liên quan