方法不会等到异步任务完成
本文关键字:任务 异步 方法 | 更新日期: 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);
}
}