ASP.NETアプリケーションには、完了するまでにかなりの時間を消費するメソッドがあります。このメソッドの呼び出しは、ユーザーが提供するキャッシュの状態とパラメーターに応じて、1回のユーザー要求中に最大3回発生する可能性があります。各通話が完了するまでに約1〜2秒かかります。メソッド自体はサービスへの同期呼び出しであり、実装をオーバーライドする可能性はありません。
したがって、サービスへの同期呼び出しは次のようになります。
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
また、メソッドの使用法は次のとおりです(注:メソッドの呼び出しは複数回発生する可能性があります)。
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
私はこの方法の同時作業を提供するために実装を私の側から変更しようとしました、そしてこれが私がこれまでに来たものです。
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
使用法(「do other stuff」コードの一部は、サービスの呼び出しと同時に実行されます):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
私の質問は次のとおりです。ASP.NETアプリケーションでの実行を高速化するために適切なアプローチを使用していますか、それとも同期コードを非同期で実行しようとして不要な仕事をしていますか?ASP.NETで2番目のアプローチが選択肢にならない理由を誰かが説明できますか(本当にそうでない場合)。また、そのようなアプローチが適用可能な場合、現時点で実行する可能性のある唯一の呼び出しである場合、そのようなメソッドを非同期で呼び出す必要がありますか(完了を待機している間に他に実行する必要がないものがある場合など)。
このトピックに関するネットの記事のほとんどは、async-await
コードでのアプローチの使用をカバーしており、すでにawaitable
メソッドを提供していますが、それは私の場合ではありません。ここに並列呼び出しの状況を説明せず、同期呼び出しをラップするオプションを拒否する私のケースを説明する良い記事ですが、私の意見では、私の状況はまさにそれを行う機会です。
ヘルプとヒントを事前に感謝します。
Task.Run
と、コンテンツは別のスレッドで実行され、スレッドプールから取得されます。次に、ブロッキング呼び出し(サービスへRun
のマイコールなど)をにラップする必要はまったくありません。メソッドの実行中にブロックされるスレッドは常に1つずつ消費されるためです。そのような状況ではasync-await
、私の場合に残される唯一の利点は、一度にいくつかのアクションを実行することです。間違っていたら訂正してください。