Das normale Verhalten für Ausnahmen, die von async Task
-Methoden ausgelöst werden, bleibt inaktiv, bis sie später oder bis zur Aufgabe beobachtet werden wird Müll gesammelt.
Ich kann mir Fälle vorstellen, in die ich sofort werfen möchte. Hier ist ein Beispiel:
%Vor% Ich könnte async void
verwenden, um dies zu umgehen, was sofort ausgelöst wird:
Jetzt kann ich diese Ausnahme direkt vor Ort mit Dispatcher.UnhandledException
oder AppDomain.CurrentDomain.UnhandledException
behandeln, um es zumindest sofort zur Aufmerksamkeit des Benutzers zu bringen.
Gibt es andere Optionen für dieses Szenario? Ist es vielleicht ein künstliches Problem?
Wenn Sie das wirklich tun wollen, können Sie den gleichen Ansatz verwenden Jon Skeet in seiner Neuimplementierung von LINQ verwendet : Erstellen Sie eine synchrone Methode, die die echte asynchrone Methode auslösen oder aufrufen kann:
%Vor% Denken Sie daran, dass es normal ist anzunehmen, dass eine Task
zurückgebende Methode nicht direkt geworfen wird. Beispielsweise können Sie Task.WhenAll()
verwenden, um unter normalen Umständen alle Ausnahmen von mehreren Vorgängen zu erhalten. Dieser Ansatz funktioniert jedoch nicht, wenn die Ausnahme sofort ausgelöst wird.
Ich denke, das normale Verhalten ist angemessen. Ihr Thread hängt von dem Ergebnis der Funktion async
ab, um die nächste Verarbeitung durchzuführen. Daher sollte die Ausnahme in Ihrem Thread ausgelöst werden.
Ihr Thread-Code könnte dann geeignete Maßnahmen ergreifen, um die Ausnahme wiederherzustellen. Da Sie Ihre Tasks weitergeben und viele Tasks ausführen können, befindet sich Ihr Wiederherstellungscode möglicherweise an einer anderen Stelle als , an der Sie das Task-Ergebnis abrufen müssen. Wenn die Ausnahme sofort ausgelöst wird, kann sie außerhalb des Wiederherstellungscodes ausgelöst werden.
Die Funktion asynch
void löst sofort aus, was sinnvoll ist, da nichts vom Ergebnis abhängt und es keine Aufgabe gibt, die übergeben werden kann.
Übrigens, der Punkt der Ausnahmebehandlung ist die Wiederherstellung des Anwendungsstatus aus Ausnahmen, sollte keine Ausnahmen abfangen, die nicht wiederhergestellt werden können . Wenn eine Ausnahme ausgelöst wird, ist der Anwendungsstatus möglicherweise beschädigt. Wenn Sie versuchen, mit beschädigten Anwendungen weiter zu arbeiten, treten weitere Probleme und Sicherheitslücken auf.
Tags und Links .net c# task-parallel-library async-await