首页 > 解决方案 > 在 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);
}

标签: c#linqexceptionasync-await

解决方案


谁能指出我为什么使用 async 和 await 运算符的 linq 语句不会将异常传播到堆栈但 foreach 循环会?

实际上,这不是 LINQ 语句;它是List<T>.ForEachList<T>.ForEach不适用于asynclambda,因为它只采用void-returning 委托类型,而不是 -returning 委托类型Task。所以asynclambda 变成了一种async void方法,应该避免


推荐阅读