Wenn ich die neue .Net 4.5 Async / Await-Funktionalität mit einem CancellationToken nutze, erhalte ich SQLException
, wenn ich einen ExecuteNonQueryAsync
-Aufruf storniere, anstatt einen OperationCanceledException
(oder eine andere Ausnahme, die eine Operation abbricht) ). Die SQLException
sagt Operation cancelled by user
am Ende der Nachricht. Ich habe erwartet, dass eine spezifischere Ausnahme ausgelöst wird, wenn die Operation abgebrochen wird. Außerdem, wie würde ich die geeigneten Try / Catch-Handler erstellen, um mit diesem erwarteten Szenario umzugehen? Normalerweise hätte ich den SQLException
als allgemeineren Fehlerblock, aber jetzt müsste ich den Text der Nachricht herauspicken, um zu sehen, ob dies nur der Benutzer ist, der auf die Abbrechen-Schaltfläche klickt !? Ich muss etwas verpassen.
Hier ist eine einfache VB WinForm-App, die zwei Tasten hat, eine für den Async-Anruf und die andere für den Abbruch. Die Try / Catch-Taste in der 1. Schaltfläche zeigt die SQLException
, die gedrückt wird, wenn die 2. Schaltfläche die Cancel-Methode aufruft.
UPDATE: Ich habe einen anderen Async-Test mit der Methode HttpClient.GetAsync
erstellt, die die Löschung unterstützt. Wenn Sie diese Aufgabe abbrechen, können Sie die OperationCanceledException
-Ausnahme, die ich ursprünglich oben erwartet hatte, verwenden. Es bleibt also die Frage: Welche Ausnahme sollten Sie erhalten, wenn Sie eine Async-Aufgabe abbrechen? Oder hängt das von jeder Methode und ihrer Implementierung ab?
Es ist nicht immer so einfach wie ein SqlException
zu fangen. Wenn Sie Task.Wait()
für die asynchrone Aufgabe verwenden, wird die SqlException
in eine AggregateException
eingeschlossen.
Ein Codebeispiel, das dies veranschaulicht, finden Sie im Abschnitt ADO.NET auf MSDN im Artikel Asynchronous Programming < a> (Abschnitt "Abbrechen einer asynchronen Operation").
Die Dokumentation für ein ähnliches Verhalten, das für die Klasse Task
allgemein ist, ist im MSDN-Artikel Task verborgen Abbruch (Teil der "Task Parallel Library" -Dokumentation), obwohl hier die AggregateException
eine TaskCanceledException
umschließt (die von OperationCanceledException
abgeleitet ist).
Hier ist ein etwas vereinfachtes Stück C # -Code, das zeigt, wie ich momentan Anfragen mit SqlClient behandle:
%Vor%Ich bin nicht sehr glücklich damit, es sieht brüchig aus, aber ohne jegliche offizielle Dokumentation ist es das Beste, was ich mir im Moment vorstellen kann. Die großen Fragen sind:
Tags und Links .net async-await