Dlaczego potrzebujemy metody Task.ContinueWith()
. Czy nie możemy po prostu napisać tego "kodu kontynuacyjnego" w treści zadania?Dlaczego potrzebujemy metody ContinueWith?
Odpowiedz
Czasami otrzymujesz zadanie z zewnątrz i chcesz przyłączyć do niego swoją kontynuację. Istnieją również sposoby tworzenia zadania bez działania (na przykład przy użyciu TaskCompletionSource).
kontynuacje zadań pozwalają na łańcuchach zadań, każde zadanie w łańcuchu następuje przez jedną inne zadanie
Również w Task.ContinueWith
metodzie można asynchronicznie sprawdzić Task
z TaskContinuationOptions
gdy cel Task
uzupełnia lub wystąpi błąd
Task task = Task.Factory.StartNew
(
() =>
{
//Your action when the task started
}
);
task.ContinueWith
(
_ =>
{
//Your action when the task completed
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
task.ContinueWith
(
(t) =>
{
//Action when error occured
Exception exception = null;
if (t.Exception.InnerException != null)
{
exception = t.Exception.InnerException;
}
else
{
exception = t.Exception;
}
//You can use this exception
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
więcej informacji znajdziesz odpowiedź here
Sasha Goldshtein jest prawidłowe. Istnieją przypadki, w których kod kompilacji "kontynuuj" nie ma bezpośredniego dostępu do, ani nawet ustawienia metody wykonywania zadania. Wchodzący w grę system, który chce agregować zadania, na przykład.
Istnieje jednak inny powód, który może mieć zastosowanie. Granularity
Należy wziąć pod uwagę wymagania, które mogą powodować używanie TaskCreationOptions.LongRunning. W równoległym systemie, w którym zaplanowano, wykonano i zakończono wiele setek procesów, program planujący zadania pracuje nad zwiększeniem koligacji procesora podczas planowania zadań.
Jeśli jesteś w sytuacji, w której możesz podzielić zadanie na precyzyjne zadania podrzędne i je łańcuchować, nie będziesz już musiał używać TaskCreationOptions.LongRunning. Mówiąc prościej, sprawdzi się to lepiej, ponieważ łatwiej jest zaplanować 100 małych zadań do ukończenia w tym samym czasie, niż zaplanować 10 dużych zadań, aby zrobić to samo w środowisku, w którym dostępne są tylko 4 rdzenie. Pamiętaj, że nie można zagwarantować, że powiązane zadanie nie rozpocznie się natychmiast po jego poprzedniku.
Jest to interesujące pytanie, które staje się problemem tylko wtedy, gdy potrzebny jest skalowalny system.
Jeśli zapytasz mnie, powinieneś użyć ContinueWith(), gdzie to możliwe, ponieważ pomoże to w skalowaniu aplikacji.