数年前、私は初めてasync / awaitを実装することに少し行き詰まりました。[このサイトで]私の質問に対する答えを得て、私は陽気な道を進みました。
しかし、最近、以前に受け取った正確な解決策に非常に近いにもかかわらず、「これらの呼び出しを並行して実行していない」と言われました。
今、私は考え直しています。
これが背景と可能な解決策です。
要点は、メソッド1を実行したくないということです。結果を待ち、次にメソッド2を実行して、それらの結果を待ちます。2つのメソッド呼び出しが互いに関係がない場合、これは遅すぎます。
2つのメソッド呼び出しを実行したいのですが、どちらもデータベースに送信されますが、それは何でもかまいません。両方の呼び出しの結果が得られるまで処理を続行したくありません。
public async Task<DataViewModel> GetDataInParallel()
{
var asyncStuff = new
{
result1 = await _databaseRepo.QuerySomething(),
result2 = await _databaseRepo.QuerySomethingElse()
};
return new DataViewModel(asyncStuff.result1, asyncStuff.result2);
}
vs
public async Task<DataViewModel> GetDataInParallel()
{
var result1Task = _databaseRepo.QuerySomething();
var result2Task = _databaseRepo.QuerySomethingElse();
var asyncStuff = new
{
result1 = await result1Task,
result2 = await result2Task
};
return new DataViewModel(asyncStuff.result1, asyncStuff.result2);
}
私は自分のWebサイトで両方のバージョンを使用していますが、オプション1を使用するバージョンが並行して処理を行っていないのではないかと考えており、パフォーマンスが低下しています。
これを証明する方法が正確にはわかりません。2つのメソッド呼び出しを並行して実行する正しいバージョンがどれであるかを誰かが知っていますか?それとも両方とも正しい/間違っていますか?
最初のバージョンは、最初の操作を待ってから2番目の操作を開始するため、並列ではありません。
2番目のバージョンでは、それらを並行して実行します(両方を開始してから、両方を待機します)。あなたはそれを使用することによってそれをより明白にすることができますTask.WhenAll
:
public async Task<DataViewModel> GetDataInParallel()
{
var result1Task = _databaseRepo.QuerySomething();
var result2Task = _databaseRepo.QuerySomethingElse();
await Task.WhenAll(result1Task, result2Task);
return new DataViewModel(result1Task.Result, result2Task.Result);
}
なぜWhenAll
より良い選択であるかを見てください:なぜ私は複数のawaitよりも単一の 'await Task.WhenAll'を好むべきですか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加