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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:31