-1

初始声明

我想异步调用一个操作,我将委托作为参数传递给该操作(详情如下)。编译器给我一个错误。有人能指出我正确的方向吗?

异步功能:

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.ForEachwith awaitinside 循环的整个构造是有缺陷的,并且该解决方案成功的机会很小。可以在此处找到更多详细信息:在并行 foreach 中嵌套等待

4

1 回答 1

-2

尝试将其更改为以下

private async Task<List<Route>> FindRoutesAsync(Destination[] Destinations){...
    Route _DestinationRoute = await FindRouteAsync(__Destination, 
                                               async d => d == __Destination);
    ...}

我不在我的办公桌附近,所以我无法测试它。

于 2013-06-05T12:03:22.157 回答