コンソールアプリを概念実証として使用し、非同期の戻り値を取得する新しいニーズがあります。
非同期の「main()」メソッドの使用を避けるために、メインメソッドでTask.WaitAll()
を使用する必要があることがわかりましたが、これは違法です。
Main()にいる間に、ジェネリックを使用したり、キャストできるオブジェクトを返すだけのオーバーロードを見つけようとするのを今は止めています。
Task.WaitAll
から戻り値を取得しません。複数のタスクの完了を待ってから、タスク自体から戻り値を取得するためにのみ使用します。
var task1 = GetAsync(1);
var task2 = GetAsync(2);
Task.WaitAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;
単一のTask
しかない場合は、Result
プロパティを使用します。タスクがまだ終了していない場合、値を返し、呼び出しスレッドをブロックします。
var task = GetAsync(3);
var result = task.Result;
一般に、非同期タスクで同期的に待機(ブロック)すること(「sync over async」)はお勧めできませんが、POCには問題ないでしょう。
ベストプラクティスとして、新しい非同期方法を使用してください。の代わりに
Task.WaitAll
つかいます await Task.WhenAll
Task.WaitAny
つかいます await Task.WhenAny
上記のコードは次のように書くことができます。
var task1 = GetAsync(1);
var task2 = GetAsync(2);
var results = await Task.WhenAll(task1, task2);
var result1 = results[0];
var result2 = results[1];