Ich versuche zu verstehen, was mit Ausnahmen passiert, die innerhalb eines Aufgabenobjekts geworfen und nie behandelt werden.
Auf MSDn heißt es:
Wenn Sie nicht auf eine Aufgabe warten, die eine Ausnahme oder einen Zugriff ausgibt seine Exception - Eigenschaft wird die Exception entsprechend der .NET-Ausnahmerichtlinie, wenn die Aufgabe Garbage-Collected ist.
Ich verstehe also nicht genau, auf welche Weise diese Ausnahmen den Programmfluss beeinflussen. Ich dachte, dass diese Ausnahmen die Ausführung unterbrechen sollten, sobald sie von Müll gesammelt wurden. Aber ich kann dieses Verhalten nicht entwerfen. Innerhalb des folgenden Snippets wird die ausgelöste Ausnahme nicht angezeigt.
%Vor%Bitte, kann jemand erklären, wie unbehandelte Aufgaben Ausnahme behandelt werden, und wie sie den Programmablauf beeinflussen.
Sie beschreiben das Verhalten so, wie es in .NET 4 war, aber es wird schwierig für Sie sein, die Speicherbereinigung zu erzwingen und dieses Verhalten tatsächlich zu beobachten. Das folgende Zitat aus Stephen Toubs excellent writ-up zu diesem Thema sollte Machen Sie es noch deutlicher:
Aufgaben verfolgen, ob eine nicht behandelte Ausnahme aufgetreten ist "Beobachtet". In diesem Zusammenhang bedeutet "beobachtet", dass Code beigetreten ist mit der Aufgabe in gewisser Weise, um zumindest darauf aufmerksam gemacht zu werden die Ausnahme. Dies könnte Wait / WaitAll auf der Task aufrufen. Es könnte die Exception-Eigenschaft der Task nach der Task überprüfen abgeschlossen. Oder es könnte die Ergebniseigenschaft einer Aufgabe verwenden. Wenn eine Aufgabe sieht, dass ihre Ausnahme in irgendeiner Weise beobachtet wurde, Das leben ist gut. Wenn jedoch alle Verweise auf eine Aufgabe entfernt werden (die Aufgabe für die Garbage Collection verfügbar machen) und falls es Ausnahme wurde noch nicht beobachtet, die Task kennt diese Ausnahme wird nie beobachtet werden. In einem solchen Fall nutzt die Task den Vorteil Finalisierung und verwendet ein Hilfsobjekt, um das unbehandelte Objekt weiterzugeben Ausnahme im Finalizer-Thread. Mit dem beschriebenen Verhalten früher wird diese Ausnahme im Finalizer-Thread nicht behandelt und Rufen Sie die standardmäßige unbehandelte Ausnahmelogik auf, die den ausstellen und den Prozess abstürzen.
Er schlug auch zwei nützliche Erweiterungsmethoden für die Behandlung von Ausnahmen in "fire-and-forget" -Tasks vor: Einer ignoriert die Ausnahme und der andere stürzt den Prozess sofort ab:
%Vor%In .NET 4.5 hat sich das Standardverhalten geändert. Nochmals ein Zitat von einem anderen Beitrag von Stephen Toub zum Thema (danke (um mich darauf aufmerksam zu machen, in den Kommentaren):
Um Entwicklern das Schreiben von asynchronem Code zu erleichtern Aufgaben, .NET 4.5 ändert das Standardausnahmeverhalten für unbeobachtet Ausnahmen. Während unbeobachtete Ausnahmen immer noch die verursachen UnobservedTaskException - Ereignis ausgelöst werden (dies wäre nicht möglich) breaking change), stürzt der Prozess standardmäßig nicht ab. Vielmehr Ausnahme wird nach der Veranstaltung gegessen, unabhängig davon, ob ein Event-Handler die Ausnahme beobachtet. Dies Verhalten kann jedoch konfiguriert werden.
Tags und Links c# exception-handling task