2013-04-24 10 views
5

Chcę uruchamiać inicjacje niektórych obiektów asynchronicznie, ale niektóre obiekty zależą od zainicjowania innych. A następnie wszystkie obiekty muszą zostać zainicjalizowane, zanim reszta mojej aplikacji będzie kontynuowana.Czy można wielokrotnie wywoływać funkcję Czekaj() na zadanie?

Czy można wywołać funkcję Czekaj() na zadaniu, a następnie wywołać ponownie funkcję Czekaj(), lub jak w moim przykładzie WaitAll() w kolekcji, w której jest ona zawarta?

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[ ]>()); 
     } 

Czy to drugie niepowodzenie Wait()/WaitAll()?

Odpowiedz

18

Z pewnością możesz dwa razy poczekać na zadanie. Możesz czekać na zadanie tyle razy, ile chcesz, bez negatywnych skutków ubocznych. Teraz, jeśli już czekałeś na zadanie w tym samym wątku, będzie to już zrobione, więc przyszłe połączenia Wait natychmiast wrócą, ponieważ nie ma na co czekać, ale na pewno nie zawiedzie lub w inny sposób wyprodukuje nieodpowiednie wyniki.

Należy zauważyć, że jeśli zadanie nie zakończyło się prawidłowo i zostało anulowane lub nie mogło zostać zakończone w wyniku wyrzucenia wyjątku, wywołanie Wait spowoduje ponowne zgłoszenie wyjątku (za każdym razem, gdy wywoływany jest Wait). Jeśli Wait rzuca ci wyjątki, jest szansa, że ​​to jest powód.

+1

Dzięki za jasną odpowiedź. I szczegóły dotyczące obsługi wyjątków. To jedna ważna kwestia, którą muszę wziąć pod uwagę. –

+0

@Servy co jeśli chcę, aby zadanie zostało uruchomione, na drugi czas oczekiwania. Jak mogę unieważnić wynik zadania? –

+0

@MerdanGochmuradov Nie możesz. Nie tak działają zadania. – Servy