SQLException beim Abbrechen der asynchronen Abfrage

8

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.

%Vor%

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?

    
Dave Michener 16.09.2013, 20:38
quelle

2 Antworten

9

Ich habe dieses Problem "gelöst", indem ich CancelToken.IsCancellationRequested im Block Catch ex As SqlClient.SqlException überprüft habe.

    
Anton S 13.02.2014 21:28
quelle
0

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 (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:

  • Ändern zukünftige Versionen von SqlClient ihr Löschverhalten?
  • Gibt es zusätzliche Verhaltensweisen, die nicht durch den obigen Code abgedeckt sind?
herzbube 09.03.2015 15:48
quelle

Tags und Links