Dapper SqlException und Unobserved Ausnahme

.net c# dapper task-parallel-library

Frage

Ich habe ein Problem mit dem folgenden Code, wenn der T-SQL-Proc einen Fehler auslöst (SQLException)

    var result = await conn.QueryMultipleAsync("Inventory.uspLoadItems", new
    {
        dbId = obj.myId,
    },
    commandType: CommandType.StoredProcedure);
    var items = await result.ReadAsync();
    var specificItems = MyCustomMapper.MapTo<MyItem>((dynamic)items);

Ich benutze Dapper Version 1.50.2.

Der Prozess wird in eine nicht beobachtete Ausnahme geworfen.

Ich kann die Ausnahme bis zur WebApi-Controller-Methode verfolgen. Aber wenn die Controller-Methode existiert, wird ein anderer Thread (spawn und unfinished) weiterhin bei var items = await items.ReadAsync(); auch wenn die WebApi-Sitzung beendet wurde (GC wurde gesammelt?). ( Text wurde gelöscht, weil ich Informationen im Parallell Stack-Fenster falsch verstanden habe. Die Ausnahme ist bei ReadAsync und nicht bei QueryMultipleAsync fehlgeschlagen und wurde daher nach der Ausnahme nicht fortgesetzt ). Sieht aus wie ein Threading-Problem in Dapper, aber ich bin mir nicht sicher.

AKTUALISIEREN

Ich habe den folgenden Link bei Microsoft Connect gefunden, der stark mit diesem Thema verwandt zu sein scheint. https://connect.microsoft.com/VisualStudio/feedback/details/2592987/sqldatareader-nextresultasync-causes-unobserved-task-exception-even-when-awited

Also für jeden anderen, der dieses Verhalten erlebt. Sie müssen auf das nächste .NET-Update warten.

Kein Dapper-Problem, aber wenn Dapper-Mitarbeiter einen temporären Workaround finden könnten, wäre das nett :)

Für jetzt ändere ich alle meine ReadAsync zu Lesen (synchron), um diesen SqlDataReader-Fehler zu vermeiden.

Beliebte Antwort

ein weiterer (spawn und unfinished) Thread wird weiterhin bei var items = await items ausgeführt. ReadAsync ();

Klingt wie die Funktion, in der all dieser Code existiert, wird asynchron ausgeführt und nicht erwartet oder anderweitig synchronisiert. Die Hauptanforderung wird beendet, während diese Funktion noch ausgeführt wird (dies ist keine Vermutung, es wird durch Ihre Beobachtung bewiesen, dass der Code ausgeführt wird, nachdem der Controller fertig ist). Wenn dieser Code abstürzt, ist die Ausnahme unbeobachtet.

Es wäre eine falsche Korrektur, unbeobachtete Ausnahmen zu ignorieren. Ich empfehle das trotzdem, aber die richtige Lösung besteht darin, auf die Aufgabe zu warten, zu der dieser Code gehört.

Da Ihr Code immer noch läuft, handelt es sich nicht um einen Framework-Fehler. Der Fehler, mit dem Sie verlinkt haben, kann dazu führen, dass Framework-Code später und unbeobachtet ausgeführt wird, aber es wird nicht dazu führen, dass Anweisungen nach dem Warten erneut ausgeführt werden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum