2013-01-17 54 views
10

私は理解できないような問題を抱えていますが、Stackoverflowの標準的な質問はここにあります。私は(これは古いSilverlightのプロジェクトからのものであり、WPFで動作するようには思えない、あなたの心を)私が間違っているのは何ラムダ式がデリゲート型ではないため 'System.Delegate'と入力できませんか?

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

を非同期的に次のコードを使用して、私のBing Mapsのを更新しようとしている

+6

「(アクション)()=> ...」はどうでしょうか? – acrilige

+0

@acriligeありがとう!なぜあなたは答えとしてそれをしなかったのですか? –

答えて

30

あなたがでキックするSystem.Delegateへの変換のためにActionに明示的にキャストする必要があり

すなわち:

_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クラスです。

ラムダ式は、コンクリートデリゲート型にのみ変換できます。この問題を解決するには

は、明示的にデリゲートを構築する必要があります。

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

ほとんど知られていない事実:署名が同一であっても、 'Action' /' ThreadStart'などではなく、 'MethodInvoker'を使用する方が*わずかに*効率的です:' Control.InvokeMarshaledCallbackDo'で直接サポートしています(via 'is'/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パラメータにはこのコントロールが含まれ、イベントパラメータはEventArgs.Emptyを含みます。デリゲートは、MethodInvokerのインスタンス、またはvoidパラメータリストを取る他のデリゲートでもあります。 EventHandlerまたはMethodInvokerデリゲートへの呼び出しは、別の種類のデリゲートへの呼び出しより速くなります。 – Alex

関連する問題