返す集約オブジェクトを構築するコントローラを持つ.netコアAPIがあります。 作成するオブジェクトは、3つのメソッド呼び出しから得られたデータから成ります。これらはすべて互いに独立しており、互いに独立して実行できます。 現在、このコントローラーのパフォーマンスを改善するためにタスクを使用しています。現在のバージョンは次のようになりますタスクを使用すると、ここで最高のソリューションである場合、私は疑問に思って...しかしweb apiコントローラ(.netコア)でasync/awaitまたはtaskを使用
[HttpGet]
public IActionResult myControllerAction()
{
var data1 = new sometype1();
var data2 = new sometype2();
var data3 = new List<sometype3>();
var t1 = new Task(() => { data1 = service.getdata1(); });
t1.Start();
var t2 = new Task(() => { data2 = service.getdata2(); });
t2.Start();
var t3 = new Task(() => { data3 = service.getdata2(); });
t3.Start();
Task.WaitAll(t1, t2, t3);
var data = new returnObject
{
d1 = data1,
d2 = data2,
d2 = data3
};
return Ok(data);
}
これがうまく機能しますか? async/awaitを使用する方が良いアイデアであり、より受け入れられる方法でしょうか?
たとえば、コントローラが非同期としてマークされ、サービスメソッドへの呼び出しごとに待機する必要がありますか?
'service'は' getdata'メソッドのための非同期の代替を提供していませんか?また、一般的には、タスクの作成とそれを手動で開始するよりも 'Task.Run()'を優先するべきです。 –
async/awaitはその意味で並列処理を助けません。実際には、3つのサービスリクエストをシリアル化します。しかし、 'Task.WaitAll'を実行すると、その行のスレッドを駐車しているので、助けになります。 –
コールドタスクを作成してから、「開始」を呼び出す理由はまったくありません。それらはスレッドではありません。ちょうど 'Task.Run'を使用してください。 'await Task.WhenAll'を使用してください。 –