You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在更新记录前等待异步ForEach执行完成?

问题原因及解决方法

你的问题出在List.ForEach不支持异步等待——你传入的async lambda本质是async void委托,这种委托会被当作“火后不管”的任务在后台执行,主线程不会等待这些异步操作完成,就直接走到了await _secondService.UpdateUsers(userList),此时用户的isRegistered还没来得及被更新。

给你两种可行的解决办法:

方法一:使用普通foreach循环(顺序执行)

把ForEach换成普通的foreach,确保每个用户的注册操作完成后再处理下一个,最后再调用第二个服务:

foreach (var user in userList)
{
    if (!user.isRegistered)
    {
        if (await _service.RegisterUser(user))
        {
            user.isRegistered = true;
        }
    }
}

await _secondService.UpdateUsers(userList);

方法二:使用Task.WhenAll并行处理(效率更高)

如果注册操作之间没有依赖,用Task.WhenAll并行执行所有注册任务,等全部完成后再调用第二个服务,比顺序执行效率更高:

var tasks = userList
    .Where(user => !user.isRegistered)
    .Select(async user =>
    {
        if (await _service.RegisterUser(user))
        {
            user.isRegistered = true;
        }
    });

await Task.WhenAll(tasks);
await _secondService.UpdateUsers(userList);

两种方法都能保证userList的更新全部完成后,再执行_secondService.UpdateUsers,解决你遇到的isRegistered值未更新的问题。

内容的提问来源于stack exchange,提问作者Vida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:25:41