Dapper SqlException 和未观察到的异常

Fro*_*ode 5 .net c# task-parallel-library dapper

当 T-SQL proc 引发错误 (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);
Run Code Online (Sandbox Code Playgroud)

我正在使用 Dapper 版本 1.50.2。

该过程被抛入一个未观察到的异常中。

我可以一直跟踪异常直到 WebApi 控制器方法。 但是当控制器方法存在时,var items = await items.ReadAsync();即使 WebApi 会话已终止(GC 收集?),另一个(生成和未完成的)线程仍会继续执行。由于我误解了 Parallell Stack 窗口中的信息,文本被删除。ReadAsync 处的异常失败,而不是 QueryMultipleAsync,因此在异常之后没有继续)。看起来像 Dapper 中的线程问题,但我不确定。

更新

我发现 Microsoft Connect 上的以下链接似乎与此主题高度相关。 https://connect.microsoft.com/VisualStudio/feedback/details/2592987/sqldatareader-nextresultasync-causes-unobserved-task-exception-even-when-awaited

所以,对于任何经历过这种行为的人。您将不得不等待下一次 .NET 更新。

不是 Dapper 的问题,但如果 Dapper 的贡献者能找到一个临时的解决方法,那就太好了 :)

现在,我将所有 ReadAsync 更改为 Read(同步)以避免此 SqlDataReader 错误。

usr*_*usr 3

另一个(生成且未完成的)线程继续执行 var items = wait items.ReadAsync();

听起来所有这些代码存在的函数都是异步执行的,并且不等待或以其他方式同步。主请求在该函数仍在运行时完成(这不是猜测,您的观察证明代码在控制器完成后执行)。然后,如果此代码崩溃,则不会观察到异常。

忽略未观察到的异常将是一个错误的修复。无论如何,我建议这样做,但正确的解决方法是等待此代码所属的任务。

由于您的代码仍在运行,因此它不是框架错误。您链接到的错误可能会导致框架代码稍后执行并且无法被观察到,但它不会导致您的等待之后的语句(再次)运行。