我已经苦恼了两天,但是我很生气,因为我似乎无法理解。
我在一个webapi
上下文中。在此请求期间,我需要向我们的另一个系统发送一些数据,由于进行了大量计算和多个数据库保存等等,该系统返回速度很慢。无论操作是否成功,我都需要记录其结果。但是我不想等待它完成。
我阅读到应该从头到尾使用async await
。如果我决定这样做,我将不得不转换许多方法,因为我已经深入了3或4个方法,我担心这将分支更多。
我的选择是什么?如果我一直异步等待,那么我在更高层的堆栈中的方法(例如WebApi控制器)该怎么办?
这是我的代码,我已经尽量简化了。现在我在PushResult()
方法中使用Task.Result()
。据我所知,这会阻塞异步?这段代码可以发送请求。但是TestLog始终是最后一个,因此不是异步的。
//I'm in a public service and referenced twice
private void MyEndProcess()
{
// other stuff
_vendorPushService.PushResult(); // This could take a while and I have to wait for it!
_logService.PostLog(LogType.TestLog, "Test");
}
//I'm referenced above and somewhere else in the code base
public void PushResult()
{
ExternalResultModel externalResultModel = _resultService.GetExternalResultModel();
PushedResultModel pushedResult = new PushedResultModel();
try
{
pushedResult = _vendorRequestService.PushResultAsync(externalResultModel).Result;
}
catch (Exception ex)
{
pushedResult.Success = false;
}
if (pushedResult.Success)
{
_logService.PostLog(LogType.SuccessLog, pushedResult.Message);
}
else
{
_logService.PostLog(LogType.FailedLog, pushedResult.Message);
}
}
public async Task<PushedResultModel> PushResultAsync(ExternalResultModel externalResultModel)
{
// setup the requestMessage
HttpResponseMessage responseMessage = await _httpRequestService
.SendRequest(requestMessage)
.ConfigureAwait(false);
return new PushedResultModel
{
Success = responseMessage.IsSuccessStatusCode,
Message = await responseMessage.Content.ReadAsStringAsync()
};
}
public class HttpRequestService : IHttpRequestService
{
private readonly HttpClient _httpClient;
public HttpRequestService(IHttpClientAccessor httpClientAccessor)
{
_httpClient = httpClientAccessor.HttpClient;
}
public async Task<HttpResponseMessage> SendRequest(HttpRequestMessage requestMessage)
{
HttpResponseMessage httpResponseMessage = await _httpClient.SendAsync(requestMessage).ConfigureAwait(false);
return httpResponseMessage;
}
}