Najlepszym sposobem jest użycie Task Parallel Library (TPL) i kontynuacje. Kontynuacja nie tylko pozwala utworzyć przepływ zadań, ale także obsługuje wyjątki. Jest to great introduction dla licencji TPL. Ale aby dać pewne wyobrażenie ...
można rozpocząć zadania OC korzystając
Task task = Task.Factory.StartNew(() =>
{
// Do some work here...
});
teraz, aby rozpocząć drugie zadanie podczas będącego krokiem wykończenia zadania (w wyniku błędu lub pomyślnie) można użyć metody ContinueWith
Task task1 = Task.Factory.StartNew(() => Console.WriteLine("Antecedant Task"));
Task task2 = task1.ContinueWith(antTask => Console.WriteLine("Continuation..."));
tak szybko jak task1
finalizuje, nie powiedzie się lub zostanie anulowane task2
„pożarów-up” i zaczyna biec. Zauważ, że jeśli task1
zakończyłoby się przed osiągnięciem drugiej linii kodu task2
, byłoby zaplanowane do natychmiastowego wykonania. Argument antTask
przekazany do drugiej wartości lambda jest odniesieniem do zadania poprzedzającego. Zobacz this link dla bardziej szczegółowych przykładów ...
Można także przekazać kontynuacje wyniki od poprzednika zadania
Task.Factory.StartNew<int>(() => 1)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask =>Console.WriteLine(antTask.Result * 4)); // Prints 64.
Note. Przeczytaj informacje na temat obsługi wyjątków w pierwszym odsyłaczu, ponieważ może to spowodować, że nowicjusz w błąd na TPL.
Ostatnią rzeczą, na którą należy zwrócić szczególną uwagę, są zadania dla dzieci. Zadania podrzędne to te, które są tworzone jako AttachedToParent
. W takim przypadku kontynuacja nie będzie działać do momentu ukończenia wszystkich zadań podrzędnych:
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { SomeMethod() }, atp);
Task.Factory.StartNew(() => { SomeOtherMethod() }, atp);
}).ContinueWith(cont => { Console.WriteLine("Finished!") });
Mam nadzieję, że to pomoże.
Więc dlaczego nie utworzysz jednego dużego delegata? – SLaks
, aby dodać do tego, co powiedział @SLaks, jeśli masz tylko listę rzeczy do uruchomienia, użycie czegoś takiego jak BackgroundWorker może być prostsze. Prawdziwym nieznanym jest to, co chcesz zrobić, gdy praca w tle zostanie ukończona - zakładając, że jest to jakaś aktualizacja UI, BackgroundWorker obsługuje to już dla ciebie, uruchamiając ukończonego delegata w wątku UI. –