Dapper SqlException和Unobserved异常

时间:2016-10-27 12:07:50

标签: c# .net 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);

我正在使用Dapper版本1.50.2。

该进程被抛入Unobserved Exception。

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

更新

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

因此,对于遇到此行为的任何其他人。您将不得不等待下一次.NET更新。

不是Dapper问题,但如果Dapper-contributionrs可以找到临时解决办法,那就太好了:)

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

1 个答案:

答案 0 :(得分:2)

  

另一个(spawn和未完成的)线程继续在var items = await items.ReadAsync();

执行

听起来像所有这些代码存在的函数异步执行,不等待或以其他方式同步。主要请求在此功能仍在运行时结束(这不是猜测,您可以通过观察证明代码在控制器完成后执行)。然后,如果此代码崩溃,则异常未被观察到。

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

由于您的代码仍在运行,因此它不是框架错误。您链接到的错误可能导致框架代码在以后和未观察到的情况下执行,但在等待运行(再次)之后它不会导致语句。