6

Czy ktoś może mi wyjaśnić użycie przeciążenia Task.Wait (CancellationToken)? MSDN mówi wiele o tym ...Metoda Task.Wait (CancellationToken)

To jest jak zwykle obsługiwać anulowanie zadania:

 var source = new CancellationTokenSource(); 
     var task = Task.Factory.StartNew(() => 
     { 
      while (true) 
      { 
       source.Token.ThrowIfCancellationRequested(); 
      } 
     }, source.Token); 

     try 
     { 
      task.Wait(); 
     } 
     catch (AggregateException exc) 
     { 
      exc.Flatten().Handle(e => e is OperationCanceledException); 
     } 

Więc kiedy jest ona przydatna przekazać token do metody czekać?

Odpowiedz

13

Rozważmy przypadek, w którym chcesz, aby anulować czeka dla zadania, bez faktycznie anulowanie samego zadania ... albo dlatego, że zadanie nie poradzić sobie anulowanie, albo dlatego, że faktycznie chcą iść dalej z zadanie, ale (powiedzmy) odpowiedź użytkownikowi: "Trwa to chwilę ... ale wciąż trwa. Zamknięcie przeglądarki jest bezpieczne." (Lub cokolwiek.)

+0

Dzięki, znalazłem odpowiedź w białej księdze, zobacz mój komentarz poniżej. – Tsef

3

Znalazłem to w białym papierze Microsoft:

Warto również zwrócić uwagę na istnienie przeciążenia dla Task.Wait(), która pobiera CancellationToken z podpisem Task.Wait (CancellationToken). To przeciążenie pobiera token, aby można było anulować oczekiwanie; to przeciążenie nie ma nic wspólnego z anulowaniem zadania, ale może spowodować przedwczesne zwlekanie z oczekiwaniem. Jeśli zostanie użyta funkcja Task.Wait (ct) i oczekiwanie zostanie przerwane, ponieważ wykryje, że token został zasygnalizowany, zostanie wywołany wyjątek OperationCanceledException (ct) w celu wskazania, że ​​operacja oczekiwania została anulowana.

+1

Czy nie jest to dokładnie to, co moja odpowiedź brzmi, w zasadzie? "Weź pod uwagę przypadek, w którym chcesz anulować oczekiwanie na zadanie" –

+0

Niestety, przez pomyłkę nie było oznaczone. zmienił to z powrotem. – Tsef

Powiązane problemy