Odpowiedz

9

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).

5

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

10

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.