저는 2 일 동안 벽에 머리를 대고 있었고, 솔직히 말해서 나 자신에게 짜증이났습니다. .동기식으로 비동기 통합
나는 webapi
컨텍스트에 있습니다. 이 요청을하는 동안 나는 다른 시스템 중 하나에 데이터를 보내야합니다.이 시스템은 계산이 복잡하고 데이터베이스 저장 등으로 인해 돌아 오는 것이 느립니다. 성공 여부에 관계없이이 작업의 결과를 기록해야합니다. 아닙니다. 하지만 끝내기 위해 기다릴 필요가 없습니다.
read 나는 위에서 아래로 끝까지 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;
}
}
모든 방법을 비동기로 사용하지 않으려는 경우 모든 항목을 동기 상태로두고 비동기 코드를 입력하지 마십시오. 전체 호출 스택을 비동기로 만들지 않고 비동기 코드를 추가하여 * 문제 *를 일으킬뿐입니다. – Servy
끝내기를 기다리지 않으려면 본질적으로 불타고 잊어 버릴 시나리오입니다. 이것은 웹 API 컨텍스트에서 자신의 문제가 있습니다. 여기를 보길 권합니다. http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html. 실제 질문에 답하기 위해 [ContinueWith'] (https://msdn.microsoft.com/en-us/library/dd321405(v=vs.110) .aspx)를보고 싶을 수도 있습니다. 스티븐의 글을 먼저 읽으십시오. – bornfromanegg
백그라운드 작업을 시작하고 클라이언트가 클라이언트에 응답을 보내기 전에 완료 될 때까지 기다리지 않아야하는 경우 - async await은별로 도움이되지 않습니다. – Evk