在Linq表达式中使用Async/Await不会引发异常

c#

晚上,

谁能指出我为什么使用 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>.ForEachList<T>.ForEach不适用于asynclambdas,因为它只需要一个void-returning 委托类型,而不是一个Task-returning委托类型。所以asynclambda 变成了一种async void方法,应该避免。


以上是在Linq表达式中使用Async/Await不会引发异常的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>