17

我遇到了一个我似乎无法弄清楚的问题,尽管这是 Stackoverflow 上的一个标准问题。

我正在尝试使用以下代码异步更新我的 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));
    }
});

我究竟做错了什么?

4

3 回答 3

41

您必须将其显式转换为 aAction才能进行转换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));
    }
}));
于 2013-01-17T14:18:10.603 回答
14

BeginInvoke()方法的参数是基Delegate类。

您只能将 lambda 表达式转换为具体的委托类型。

要解决此问题,您需要显式构造一个委托:

BeginInvoke(new MethodInvoker(() => { ... }));
于 2013-01-17T14:18:10.040 回答
3

尝试

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

或使用动作

于 2013-01-17T14:21:12.627 回答