2012-01-14 15 views
5

En alguna clase quiero cargar 2 recogida de forma asíncrona con tareas y detener busyindicatorContinuar tarea después de que todas las tareas terminen

que intentar algo como esto

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
WaitingIndicatorViewModel.IsBusy = true; 
var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService).ContinueWith(t => Data1Collection = t.Result, uiScheduler); 
var loadData2 = new Task<ObservableCollection<Data2>>(GetData2FromService).ContinueWith(t => Data2Collection = t.Result, uiScheduler); 

Task.Factory.StartNew(() =>{ 
       loadData1.Start();//<--Exception here   
       loadData2.Start(); 
       Task.WaitAll(loadData1, loadData2); 
     }) 
.ContinueWith(o => WaitingIndicatorViewModel.IsBusy = false, uiScheduler); 

Pero esto producirá una excepción InvalidOperationException:Start may not be called on a continuation task.

¿Por qué esto no funciona y cómo puedo ejecutar la tarea continuar después de finalizar ambas tareas sin bloquear el hilo actual?

+0

¿Qué línea arroja la excepción? –

+0

¿Las tareas loadData1 y loadData2 tienen alguna relevancia aquí? – Tudor

+0

ver publicación editada @ChrisShain –

Respuesta

15

En lugar de:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService) 
       .ContinueWith(t => Data1Collection = t.Result, uiScheduler); 

Creo que lo que quiere decir es:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService); 
loadData1.ContinueWith(t => Data1Collection = t.Result, uiScheduler); 

Ahora se puede (más tarde) llamada:

loadData1.Start(); 

La diferencia es que está asignando loadData1 al más externo tarea. En el código original, está asignando loadData1 el resultado de ContinueWith, que es otra cosa (una segunda tarea, para que pueda esperar o continuar desde la segunda tarea).

Nota: si desea esperar a que la tarea interna, debe capturar el resultado de la llamada ContinueWith en una nueva variable, y esperar en que.

+0

Ahh, gracias Marc! ¡¡tienes toda la razón!! Cambio la llamada a Task.Factory.Start que inicia la primera tarea automáticamente y funciona de manera excelente –

Cuestiones relacionadas