複数のタスクの完了を待つためにTask.WhenAllを使用しようとしています。Task.WhenAll()を正しく使用する方法
私のコードは以下の通りです。複数の非同期タスクを起動することになっています。それぞれのタスクは、バスルートを取得してローカルアレイに追加します。ただし、Task.WhenAll(...)はすぐに戻り、ローカルルート配列の数はゼロです。これは、各タスク内のさまざまな「待機」ステートメントがフローが中断され、タスクが終了するまで戻らないことを意味することを期待しているので、奇妙に思えます。
List<Task> monitoredTasks = new List<Task>();
foreach (BusRouteIdentifier bri in stop.services)
{
BusRouteRequest req = new BusRouteRequest(bri.id);
// Start a new task to fetch the route for each stop
Task getRouteTask = Task.Factory.StartNew(async() =>
{
var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req);
// Add the route to our array (on UI thread as it's observed)
await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate
{
this.routes.Add(route);
});
});
// Store the task in our monitoring list
monitoredTasks .Add(getRouteTask);
}
Debug.WriteLine("Awaiting WHENALL");
await Task.WhenAll(monitoredTasks);
Debug.WriteLine(string.Format("WHENALL returned (routes count is {0} ", this.routes.Count));
this.OnWillEndFetchingRoutes(new EventArgs());
私は明らかに何か間違っていますが、何ですか?
あなたは最終的には 'Task'が故障状態になっていないかどうかを確認しようとしました
感謝を:
私が欲しかったものを達成するために、私は次のようにリファクタリングするために必要な? –
私はそれがforeachループの中で何か間違った 'dispatcher'を待つかもしれないと思う。 UIスレッドはすぐに観察され、表示されますか? –
@ie。はい、その状態はRanToCompletionです。配列内のすべてのタスクの状態は、RanToCompletionでもありますが、実際に個別に検査すると、それぞれの結果フィールドはWaitingForActivationになります –