gpt4 book ai didi

c# - ContinueWith 方法不会等到异步任务完成

转载 作者:行者123 更新时间:2023-12-02 09:07:16 24 4
gpt4 key购买 nike

我正在尝试记录对 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;
});
}

日志响应:

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

关于c# - ContinueWith 方法不会等到异步任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10608608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com