2013-04-24 8 views
5

Voglio eseguire le inizializzazioni di alcuni oggetti in modo asincrono, ma alcuni oggetti dipendono da altri che vengono inizializzati. E quindi tutti gli oggetti devono essere inizializzati prima che il resto della mia applicazione continui.È possibile chiamare Wait() su un'attività più volte?

È possibile chiamare Wait() su un'attività e successivamente richiamare Wait() su di esso o come nel mio esempio WaitAll() su una raccolta in cui è incluso?

Dictionary<String, Task> taskdict = new Dictionary<String, Task>(); 

    taskdict.Add("Task1", 
     Task.Factory.StartNew(() => { 
     //Do stuff 
     })); 

    taskdict.Add("Task2", 
     Task.Factory.StartNew(() => { 
      taskdict[ "Task1" ].Wait(); 

     //Do stuff 

     })); 

     try { 
     Task.WaitAll(taskdict.Values.Convert<Task[ ]>()); 
     } 

Oppure quel secondo Wait()/WaitAll() non riesce?

risposta

18

È sicuramente possibile attendere due volte un'attività. Puoi aspettare un compito tutte le volte che vuoi senza effetti collaterali negativi. Ora, se hai già aspettato un'attività nello stesso thread, sarà già fatto, quindi le future chiamate Wait torneranno tutte immediatamente perché non c'è nulla da attendere, ma sicuramente non falliranno o produrranno in altro modo risultati.

Si noti che se un compito non è stato completato normalmente e invece è stato annullato o non poteva finire a causa di un'eccezione che sono gettati quindi chiamando Wait sarà ri-generare l'eccezione (ogni volta che si chiama Wait). Se Wait lancia delle eccezioni per te, c'è una possibilità che sia questa la ragione.

+1

Grazie per una risposta chiara. E per i dettagli sulla gestione delle eccezioni. Questa è una questione importante che devo considerare. –

+0

@Servy e se voglio che l'attività venga eseguita, in attesa. Come posso invalidare il risultato dell'attività? –

+0

@MerdanGochmuradov Non puoi. Non è così che funzionano le attività. – Servy

Problemi correlati