在异步方法

时间:2015-07-15 14:15:14

标签: c# asynchronous asp.net-web-api

我正在使用DelegatingHandler拦截从一个服务到另一个服务的所有呼叫。我对DelegatingHandlers完全不了解。

这就是问题所在。 我们目前有一个API来接受调用并测量并发调用,它有一些机制可以根据需要限制它。它就是这种形式。 (由于实际API对于调试很重,我实际上使用以下存根方法来测试它)

private  Task<HttpResponseMessage> ExecuteAsync1(Func<Task<HttpResponseMessage>> action)
{
    return ExecuteAsync2(action);
}

private async Task<HttpResponseMessage> ExecuteAsync2(Func<Task<HttpResponseMessage>> action)
{
    return await action().ConfigureAwait(false);
}

现在在这个委托处理程序中,我必须像这样使用这个API。

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    if (this.ThrottlingFactory == null || !this.ThrottlingEnabled)
    {
        return await base.SendAsync(request, cancellationToken);
    }
    else
    {
        var response = await this.ExecuteAsync1(() =>
        {
            return base.SendAsync(request, cancellationToken);
        });

        // Analyse response for certain thing here.

        return response;
    }
}

我的问题是,在执行ExecuteAsync1(它实际上完成了ExecuteAsync2)后,代码永远不会返回。我尝试了很多变化,比如为链中的所有方法添加async / await,包括anon方法等。有人可以指点我在这里做错的事吗?

1 个答案:

答案 0 :(得分:0)

这是我必须要做的。我不得不ConfigureAwait(false)来电话。

 var response = await this.ExecuteAsync1(() =>
            {
                return base.SendAsync(request, cancellationToken);
            }).ConfigureAwait(false);