gpt4 book ai didi

c# - 不等待 lambda foreach 中的异步调用

转载 作者:行者123 更新时间:2023-11-30 13:56:11 24 4
gpt4 key购买 nike

我有以下方法在它完成之前返回(为简洁起见减少了方法):

private void ProcessAllItems(List<Item> items)
{
items.ForEach(async item =>
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
});
}

Processor.IOBoundTaskAsync 方法返回一个 Task ,因此不是 void。

那么,这是怎么回事?

我希望 lambda foreach 一次处理一个项目,所以不是并行处理。对于第一次迭代,代码进入 IOBoundTaskAsync 并到达第一个“等待”(它调用 4 个等待的 Web 服务方法中的第一个),然后调用方法“ProcessAllItems”退出。

我只使用测试数据,所以我的列表中只有一项。

我错过了什么?

最佳答案

List<T>.ForEach 将您的异步 lambda 转换为 async void , 因为它接受 Action<T> .虽然它这样做并且在异常处理方面有一些复杂性,但您的 ForEach调用应该正常工作。如果不是,您可能没有正确使用异步模式。我建议您在第一个 await 之后设置一个断点并查看继续执行。

我建议您使用常规 foreach相反:

private async Task ProcessAllItemsAsync(List<Item> items)
{
foreach (var item in items)
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
}
}

阅读How can I use Async with ForEach?了解更多。

关于c# - 不等待 lambda foreach 中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com