여러 작업이 완료 될 때까지 Task.WhenAll을 사용하려고합니다.Task.WhenAll()을 올바르게 사용하는 방법
내 코드는 다음과 같습니다. 여러 개의 비동기 작업을 시작해야하는데, 각각의 비동기 작업은 버스 경로를 검색 한 다음 로컬 배열에 추가합니다. 그러나 Task.WhenAll (...)은 즉시 반환하고 로컬 경로 배열의 개수는 0입니다. 이것은 각 작업 내에서 다양한 '대기 중'문이 흐름이 일시 중단되고 작업이 완료 될 때까지 반환되지 않는다는 것을 의미하기 때문에 이상하게 보입니다.
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입니다. –