我遇到了一个我似乎无法弄清楚的问题,尽管它在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));
}
});
我做错了什么?
答案 0 :(得分:33)
您必须明确地将其强制转换为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));
}
}));
答案 1 :(得分:14)
BeginInvoke()
方法的参数是基础Delegate
类。
您只能将lambda表达式转换为具体的委托类型。
要解决此问题,您需要显式构建委托:
BeginInvoke(new MethodInvoker(() => { ... }));
答案 2 :(得分:3)
尝试
Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate
{
//Do something
}));
或使用动作