c# – Dapper SqlException和Unobserved异常

当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收集?). (由于我误解了Parallell堆栈窗口中的信息,文本被删除.ReadAsync上的异常失败,而不是QueryMultipleAsync,因此在异常后没有继续).
看起来像Dapper中的线程问题,但我不确定.

UPDATE

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

所以,对于遇到这种行为的任何其他人.您将不得不等待下一次.NET更新.

不是一个小巧的问题,但如果Dapper贡献者可以找到一个临时的解决方案,那将是不错的:)

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

最佳答案

another (spawn and unfinished) thread continue to execute at var items = await items.ReadAsync();

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

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

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

点赞