如何在更新记录前等待异步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
相关产品推荐
相关产品推荐

