C#中如何等待foreach循环内操作完成后再进行下一次迭代?
解决方法
首先纠正你代码里的一个小问题:dataGridView1.Row应该写成dataGridView1.Rows,否则会编译出错。
接下来分两种场景处理你的需求:
场景1:循环内的操作是异步方法
如果你的// Do Something是一个返回Task/Task<T>的异步操作,想等当前行的操作完成后再处理下一行,直接在循环里用await等待当前异步任务即可,不需要固定延迟:
async Task Method() { foreach (DataGridViewRow row in dataGridView1.Rows) { // 假设DoSomethingAsync是你的异步处理方法,传入当前行 await DoSomethingAsync(row); } // 这里不需要Task.Delay了,所有迭代完成后方法自然结束 }
这种写法会严格按顺序处理每一行,上一行的异步操作执行完毕,才会进入下一次循环迭代。
场景2:用Task.WhenAll并行处理所有行
如果你的行操作之间没有依赖关系,允许同时处理多行,就可以用Task.WhenAll来并行执行所有任务,等全部完成后再继续,效率比顺序执行更高:
async Task Method() { var taskList = new List<Task>(); foreach (DataGridViewRow row in dataGridView1.Rows) { // 把每一行的异步任务加入列表,此时任务已经开始执行 taskList.Add(DoSomethingAsync(row)); } // 等待所有并行任务全部完成 await Task.WhenAll(taskList); }
两者的区别
- 顺序执行:适合操作有先后依赖(比如前一行的结果影响后一行)、或者需要严格按界面行顺序处理的场景。
- 并行执行:适合无依赖的独立操作,能充分利用系统资源提升处理速度,但要注意如果操作涉及共享资源(比如同一个数据库连接、UI控件操作),需要额外加同步逻辑避免冲突。
补充:如果操作是同步的
如果你的// Do Something是同步代码,那你当前的foreach本来就是顺序执行的——处理完当前行的所有操作,才会进入下一次循环。这种情况下直接删掉最后的Task.Delay(120000)就行,完全不需要额外等待。
内容的提问来源于stack exchange,提问作者T4556
相关产品推荐
相关产品推荐

