Witam po długiej przerwie wszystkich stęsknionych wpisów odnośnie TPLa.
Pamiętam moje przyrzeczenie odnośnie pisania przynajmniej 1 wpisu na tydzień z tego tematu, ale niestety inne rzeczy nie pozwalają poświęcić się temu tematowi w takim stopniu jakbym sobie tego życzył. No, ale nie tracąc czasu na smętne wstępy przejdźmy do treści…dziś krótko acz przydatnie.

Dziś chciałbym powiedzieć o dość ciekawej funkcjonalności a mianowicie kontynuacjach. Dzięki nim możemy napisać następujący fragment kodu:

Task t = Task.Factory.StartNew(() => DoSthImportant())
.ContinueWith(task => DoSthEvenMoreImportantAfterwards());

Dzięki takiej konstrukcji mamy zapewnione, iż po tym jak wykona się kod w DoSthImportant zostanie wykonany kod w DoSthEvenMoreImportantAfterwards. Jednak siła tego rozwiązania polega na dodatkowych parametrach. Dzięki nim możemy napisać coś takiego:

Task operate = Task.Factory.StartNew(() => Operate())
.ContinueWith(task => LogError(task.Exception), TaskContinuationOptions.NotOnRanToCompletion);

Co osiągamy dzięki takiej konstrukcji? Parametr NotOnRanToCompletion powoduje, że dany kawałek zadania zostanie wykonany, tylko jeśli zadanie je poprzedzająca nie zakończy się powodzeniem. Co to znaczy? A to, że np. pojawi wyjątek lub też zadanie zostanie anulowane. Pretty handy! Typ TaskContinuationOptions daje nam jeszcze kilka innych opcji takich jak: OnlyOnCanceled, OnlyOnFaulted itp. Oczywiście pierwszy przykład jest równoważny wywołaniu ContinueWith z parametrem OnlyOnRanToCompletion. Przydatne, nieprawdaż?