初始声明
我想异步调用一个操作,我将委托作为参数传递给该操作(详情如下)。编译器给我一个错误。有人能指出我正确的方向吗?
异步功能:
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 表达式。
更新声明 1
@svick,@Stephen Cleary:谢谢你们!你是对的,问题正如你在外循环中所期望的那样:我所拥有的是(简化的):
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 的评论引导我进行代码分析,最终向我展示了错误。
更新声明 2
似乎Parallel.ForEach
with await
inside 循环的整个构造是有缺陷的,并且该解决方案成功的机会很小。可以在此处找到更多详细信息:在并行 foreach 中嵌套等待。