方法不会等到异步任务完成

本文关键字:任务 异步 方法 | 更新日期: 2023-09-27 18:34:11

我正在尝试记录对API的请求和响应。我目前正在使用一个 demissionatingHandler 来捕获 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;
             });
    }

日志响应:

    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);
    }

当我尝试将内容插入存储库的数据库时,我收到空异常。但是当我逐步进入内容对象时,它填充了响应。我想我正在尝试在请求完成之前将数据插入数据库。

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

有什么想法吗?

方法不会等到异步任务完成

您正在异步设置info.Content_repository.LogResponse(info)的调用。 LogResponse 很可能在执行延续之前被调用。 将您的呼叫移动到延续正文中的LogResponse。 例如:

if (response.Content != null)
{
    response.Content.ReadAsStringAsync().ContinueWith((task) =>
            { 
                info.Content = task.Result;
                _repository.LogResponse(info);
            }
        );
}
if (response.Content != null)
{
    var task = response.Content.ReadAsStringAsync().ContinueWith((task) =>
                       { 
                           info.Content = task.Result;
                       });
    task.Wait();
}
_repository.LogResponse(info);

你可以试试这个例子:

private void LogResponse(HttpResponseMessage response)
{
    ApiResponse info = new ApiResponse();
    //Populate response obj   
    if (response.Content != null)
    {
        var info = await response.Content.ReadAsStringAsync();
        _repository.LogResponse(info);
    }
}