c# - 在 Linq 表达式中使用 Async/Await 不会引发异常
问题描述
晚上,
谁能指出我为什么使用 async 和 await 运算符的 linq 语句不会将异常传播到堆栈但 foreach 循环会?必须有一些东西在引擎盖下并在某处记录了这种行为,我只是没有运气找到它。#googlefoofail #doyouevenasyncbrah
如果您运行单元测试,您将看到它返回时没有错误且有效。但是,如果您调试单元测试,它将因错误而中断,但是它将允许您继续,并且该错误永远不会传播回堆栈。
如果您注释掉 linq 语句并取消注释 foreach 循环,则在尝试向字典添加重复键时会出现预期错误。
[TestMethod]
public void tester()
{
List<KeyValuePair<string, string>> pairs = new List<KeyValuePair<string, string>>()
{
{ new KeyValuePair<string, string>("test", "first") },
{ new KeyValuePair<string, string>("test", "second") }
};
fails = new Dictionary<string, string>();
pairs.ForEach(async x => await testasync(x)); //<========= does not throw error
//foreach (KeyValuePair<string,string> pair in pairs) //<========= throws error
//{
// testasync(pair).GetAwaiter().GetResult();
//}
Assert.IsTrue(1 == 1);
}
private Dictionary<string, string> fails;
private async Task testasync(KeyValuePair<string, string> pair)
{
fails.Add(pair.Key, pair.Value);
}
解决方案
谁能指出我为什么使用 async 和 await 运算符的 linq 语句不会将异常传播到堆栈但 foreach 循环会?
实际上,这不是 LINQ 语句;它是List<T>.ForEach
。List<T>.ForEach
不适用于async
lambda,因为它只采用void
-returning 委托类型,而不是 -returning 委托类型Task
。所以async
lambda 变成了一种async void
方法,应该避免。
推荐阅读
- sql - SQL (Snowflake) – 30 天前瞻/滚动平均值
- google-cloud-platform - Google Compute Engine REST API - 按空值过滤列表
- python - 将 pandas 列转换为 astype(str) 后出现尾随零的问题
- iis - 如何在 IIS 中查找 CGI 版本
- powershell - 通过cygwin从shell脚本运行时如何将参数传递给powershell脚本?
- ruby-on-rails - RoR 6:表单中的第一个参数不能包含 nil 或为空错误
- azure-data-factory-2 - Azure 数据工厂的 Web Hook Activity 在 1 分钟后超时
- python - 如何从头开始调试反向传播实现?
- c - 拉宾指纹表
- bash - 如何从会话外部获取 tmux 会话中当前行的内容?