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 控制器方法。 但是当控制器方法存在时,(由于我误解了 Parallell Stack 窗口中的信息,文本被删除。ReadAsync 处的异常失败,而不是 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 的贡献者能找到一个临时的解决方法,那就太好了 :)
现在,我将所有 ReadAsync 更改为 Read(同步)以避免此 SqlDataReader 错误。
另一个(生成且未完成的)线程继续执行 var items = wait items.ReadAsync();
听起来所有这些代码存在的函数都是异步执行的,并且不等待或以其他方式同步。主请求在该函数仍在运行时完成(这不是猜测,您的观察证明代码在控制器完成后执行)。然后,如果此代码崩溃,则不会观察到异常。
忽略未观察到的异常将是一个错误的修复。无论如何,我建议这样做,但正确的解决方法是等待此代码所属的任务。
由于您的代码仍在运行,因此它不是框架错误。您链接到的错误可能会导致框架代码稍后执行并且无法被观察到,但它不会导致您的等待之后的语句(再次)运行。
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |