Wird sofort von der asynchronen Methode geworfen

8

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:

%Vor%

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?

    
Noseratio 29.03.2014, 00:14
quelle

2 Antworten

4

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.

    
svick 31.03.2014, 11:32
quelle
1

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.

    
Khanh TO 29.03.2014 01:09
quelle