Wenn Sie eine Aufgabe erstellen und niemals task.Wait()
das Ergebnis von a aufrufen oder versuchen, es abzurufen Task<T>
, wird die Anwendung während der Finalisierung heruntergefahren, wenn die Aufgabe vom Garbage Collector erfasst wird. Weitere Informationen finden Sie auf der MSDN-Seite zur Ausnahmebehandlung in der TPL .
Die beste Option hier ist, die Ausnahme zu "behandeln". Dies kann über eine Fortsetzung erfolgen. Sie können der Aufgabe eine Fortsetzung hinzufügen und die auftretende Ausnahme protokollieren / schlucken / usw. Dies bietet eine saubere Möglichkeit, Aufgabenausnahmen zu protokollieren, und kann als einfache Erweiterungsmethode geschrieben werden, z.
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
Mit den oben genannten Funktionen können Sie verhindern, dass eine Aufgabe die App herunterfährt und protokolliert, und zwar über:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternativ können Sie die TaskScheduler.UnobservedTaskException abonnieren und dort bearbeiten.
Off
Verwenden Sie für zusätzliche Unterhaltung eine statische Stub-Methode in einer Klasse, die als Wort aus vier Buchstaben Ihrer Wahl bezeichnet wird, und verwenden Sie diese Methode für Ihre Sammel-Fortsetzungen. Hilft, die aufgestaute Frustration dieser besonderen Ausnahme zu bekämpfen..Net 4.0
. Die Ausnahmebehandlung wurde standardmäßig geändert ,.net 4.5
um nicht reißen die Anwendung herunter . WeitereSicher; Dies bedeutet, dass a
Task
abgeschlossen wurde, nachdem es der Speicherbereinigung überlassen wurde, aber die Aufgabe selbst fehlgeschlagen ist. Es gibt zwei Korrekturen:ContinueWith(...)
zu unterzeichnen, und überprüfen.IsFaulted
und.Exception
auf dieTask
im Parameter)TaskScheduler.UnobservedTaskException
Ereignis und markieren Sie es als beobachtet (Aufrufe.SetObserved()
nach Protokollierung des Fehlers)quelle
IsFaulted
, können Sie dieOnlyOnFaulted
Fortsetzung Option verwenden und die manuelle Überprüfung vermeiden ...SetObserved
onUnobservedTaskExceptionEventArgs
aufgerufen werden muss.Probier diese:
quelle