web-dev-qa-db-ja.com

コンソールアプリでTask.WaitAll()から戻り値を取得するにはどうすればよいですか?

コンソールアプリを概念実証として使用し、非同期の戻り値を取得する新しいニーズがあります。

非同期の「main()」メソッドの使用を避けるために、メインメソッドでTask.WaitAll()を使用する必要があることがわかりましたが、これは違法です。

Main()にいる間に、ジェネリックを使用したり、キャストできるオブジェクトを返すだけのオーバーロードを見つけようとするのを今は止めています。

35

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には問題ないでしょう。

61
i3arnon

ベストプラクティスとして、新しい非同期方法を使用してください。の代わりに

  • 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];
29
alltej