在Asyncronous Task完成之前,ContinueWith方法不会等待

gdp*_*gdp 2 c# asynchronous task asp.net-web-api

我正在尝试记录API的请求和响应.我目前正在使用delegatingHandler捕获httpwebresponses和httpwebrequests.

处理器:

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        LogRequest(request);
        return base.SendAsync(request, cancellationToken).ContinueWith((task) =>
             {
                 HttpResponseMessage response = task.Result;
                 LogResponse(response);
                 return response;
             });
    }
Run Code Online (Sandbox Code Playgroud)

LogResponse:

    private void LogResponse(HttpResponseMessage response)
    {
        ApiResponse info = new ApiResponse();
        //Populate response obj   

        if (response.Content != null)
        {
            response.Content.ReadAsStringAsync().ContinueWith((task) =>
                    { 
                        info.Content = task.Result;
                    }
                );
        }
        _repository.LogResponse(info);
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试将内容插入我的存储库中的数据库时,我得到一个null异常.但是当我逐步完成内容对象时,它会填充响应.我想我正在尝试在请求完成之前将数据插入到数据库中.

我不想等待它,因为这违背了使用异步请求的目的,如何在请求完成时将其挂钩以运行logresponse方法?我认为continueWith处理了这个并在任务完成时运行动作(这是否意味着下载请求不一定完成了?).

有任何想法吗?

Pet*_*hie 6

您正在info.Content调用异步设置_repository.LogResponse(info). LogResponse很可能在连续执行之前调用.将你的电话转移LogResponse到续集的正文中.例如:

if (response.Content != null)
{
    response.Content.ReadAsStringAsync().ContinueWith((task) =>
            { 
                info.Content = task.Result;
                _repository.LogResponse(info);
            }
        );
}
Run Code Online (Sandbox Code Playgroud)