2013-01-17 84 views
10

我有一個問題,我似乎無法弄清楚,雖然它的一種標準問題在這裏的Stackoverflow。無法將lambda表達式轉換爲類型'System.Delegate',因爲它不是委託類型?

我試圖更新我的Bing地圖異步使用下面的代碼(請注意,這是從舊的Silverlight項目似乎並沒有在WPF工作)

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

我在做什麼錯?

+6

那麼'(Action)(()=> ...)''? – acrilige

+0

@acrilige謝謝!你爲什麼不把它作爲答案? –

回答

30

你必須明確地將它轉換爲Action爲了轉化爲System.Delegate在踢

也就是說:

_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

爲了您的興趣,您可能想看到我添加到SLaks的回答中的評論 –

13

BeginInvoke()方法的參數是基類Delegate類。

只能將lambda表達式轉換爲具體的委託類型。

要解決這個問題,你需要明確構建一個委託:

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

鮮爲人知的事實:儘管簽名是相同的,但在這裏使用'MethodInvoker'而不是'Action' /'ThreadStart'等效率更高*它直接支持'Control.InvokeMarshaledCallbackDo'(via '是'/ cast) - 其中 - 其他委託類型使用'DynamicInvoke'。唯一的其他直接支持的委託類型是'WaitCallback'和'EventHandler' –

2

嘗試

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

或使用動作

+4

爲了您的興趣,您可能想看到我添加到SLaks的評論'answer –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: 委託可以是EventHandler的一個實例,在這種情況下sender參數將包含此控件,並且event參數將包含EventArgs.Empty。該委託也可以是MethodInvoker的實例,或任何其他採用void參數列表的委託。對EventHandler或MethodInvoker委託的調用比對另一種委託類型的調用要快。 – Alex

相關問題