我想异步调用一个操作,我将一个委托作为参数传递(详情如下)。编译器给我一个错误。有人能指出我正确的方向吗?
异步功能:
private async Task<Route> FindRouteAsync(Destination Destination,
Func<Destination, bool> predicate){...
List<Destination> _Destinations = __Route.Destinations.Where(predicate).ToList();
...}
致电代码:
private async Task<List<Route>> FindRoutesAsync(Destination[] Destinations){...
Route _DestinationRoute = await FindRouteAsync(__Destination,
d => d == __Destination);
...}
编译错误:
'await'运算符只能在异步lambda表达式中使用。考虑使用'async'修饰符标记此lambda表达式。
Parallel.ForEach<Destination>(Destinations, __Destination =>
{
Route _DestinationRoute = await FindRouteAsync(__Destination,
d => d == __Destination);
}
由于这个lambda表达式__Destination => {...}
,代码无法编译。我把它变成了__Destination => async {...}
,现在它可以了。
现在看起来像这样:
Parallel.ForEach<Destination>(Destinations, async __Destination =>
{
try
{
// First, try to find an exact match
Route _DestinationRoute = await FindRouteAsync(__Destination, d => d == __Destination);
if (_DestinationRoute.ConnectionId != 0)
{ _DestinationRoutes.Enqueue(_DestinationRoute); }
...
}
catch...
});
所以我只是在我的代码中查看错误的lambda表达式。另一个引起了所有的大惊小怪。 再次感谢你!获得的经验:“不要在未来如此快地跳过假设”。
PS:这是我第一次来这里,也许你可以帮助我给予应有的信用。我认为svick,Stephen Cleary和(透视)Javalsu的贡献是有帮助的。现在我该怎么做?平心而论,svick的评论让我进行了代码分析,最终向我展示了错误。
似乎循环内Parallel.ForEach
await
的整个构造存在缺陷,解决方案成功的可能性很小。更多细节可以在这里找到:Nesting await in Parallel foreach。
答案 0 :(得分:-2)
尝试将其更改为以下
private async Task<List<Route>> FindRoutesAsync(Destination[] Destinations){...
Route _DestinationRoute = await FindRouteAsync(__Destination,
async d => d == __Destination);
...}
我不在我的办公桌附近所以我无法测试它。