当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控制器方法的异常。 但是当控制器方法存在时,另一个(生成和未完成)线程继续在( Text deleted由于我误解了Parallell Stack窗口中的信息.Andasync异常失败,而不是QueryMultipleAsync,因此在异常之后没有继续。
看起来像Dapper中的线程问题,但我不确定。var items = await items.ReadAsync();
执行,即使WebApi会话已经终止(GC收集?)。
更新
我发现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错误。
答案 0 :(得分:2)
另一个(spawn和未完成的)线程继续在var items = await items.ReadAsync();
执行
听起来像所有这些代码存在的函数异步执行,不等待或以其他方式同步。主要请求在此功能仍在运行时结束(这不是猜测,您可以通过观察证明代码在控制器完成后执行)。然后,如果此代码崩溃,则异常未被观察到。
忽略未观察到的异常将是一个不正确的修复。无论如何,我建议这样做,但正确的解决方法是等待此代码所属的任务。
由于您的代码仍在运行,因此它不是框架错误。您链接到的错误可能导致框架代码在以后和未观察到的情况下执行,但在等待运行(再次)之后它不会导致语句。