2016-11-12 3 views
0

Ich habe viele Möglichkeiten ausprobiert, konnte aber die Abbruchausnahme in task.ContinueWith nicht abfangen. Gibt es etwas falsch hier:C#: So fangen Sie die Ausnahmebedingung in task.continuewith

CancellationTokenSource tokenSource = new CancellationTokenSource(); 
Task task = new Task(()=> { Thread.Sleep(1000); Console.WriteLine("in task!"); }, tokenSource.Token); 

task.Start(); 
tokenSource.Cancel(); 
task.ContinueWith(t => 
{ 
     if(t.IsCanceled) 
     { 
      AggregateException e = t.Exception; 
      if(e == null) // is true 
       Console.WriteLine("Cancelled: "); 
     } 
}); 

Console.Read(); 

Die Ausgabe lautet:

Abgebrochen:

, die die Stornierung Ausnahme impliziert gefangen ist aber die Ausnahme selbst ist leer. Meine Frage ist, wie man die Annullierungsausnahme hier erhält?

Dank

Derek

+0

Nun, wenn eine Aufgabe abgebrochen wird, dann weil Sie sie abgebrochen haben. Wenn eine Aufgabe fehlerhaft ist, kann es einen Grund dafür geben, und dann brauchen Sie die Ausnahme, um eine Ahnung zu haben. Warum benötigen Sie die Ausnahme, wenn die Aufgabe abgebrochen wird? BTW Wenn es eine Ausnahme gab, können Sie nur die OperationCanceledException erwarten. Es machte keinen Sinn, die Ausnahme zu behalten; o) –

+0

Warum können Sie nicht einfach den 't.IsCanceled' Test verwenden? Das scheint ausreichend zu sein. – usr

Antwort

1

Die Stornierung Ausnahme nicht automatisch, sobald Sie das CancellationToken stornieren geworfen wird, wenn Sie nicht die Ausnahme selbst die Aufgabe wird abgebrochen werfen aber keine Ausnahme ausgelöst wird, diese Deshalb ist die Ausnahmeeigenschaft der Aufgabe null.

Um die Ausnahme zu werfen, sollten Sie die Methode ThrowIfCancellationRequested in einer Ihrer Aufgabenaktionen verwenden.

Weitere Informationen darüber here.

+1

Und auch * nicht * übergeben 'tokenSource.Token' an die Task ctor. – usr

Verwandte Themen