私は今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
それが終わるのを待たずにいたいなら、これは本質的には忘れ去られるシナリオです。これは、Web 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