Await方法使用Func <t,tresult =“”>委托作为参数:编译错误</t,>

时间:2013-06-05 11:43:15

标签: c# lambda async-await func

初始声明

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

异步功能:

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,@ Stete 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 await的整个构造存在缺陷,解决方案成功的可能性很小。更多细节可以在这里找到:Nesting await in Parallel foreach

1 个答案:

答案 0 :(得分:-2)

尝试将其更改为以下

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

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