如何在for循环创建线程后等待所有线程执行完毕?
解决方案
方法1:用集合存储线程对象,统一等待
你可以在循环中将创建的线程对象存入集合,循环结束后遍历集合调用Join(),避免逐个手动写Join的冗余:
List<Thread> threads = new List<Thread>(); for(int i = 0; i < 25; i ++) { Program x = new Program(); Thread myThread = new Thread(() => x.doSomething(someParameter)); myThread.Start(); threads.Add(myThread); // 将线程加入集合统一管理 } // 等待所有线程执行完成 foreach(var thread in threads) { thread.Join(); } // 这里写所有线程完成后要执行的后续代码
方法2:使用Parallel.For(极简替代方案)
如果不需要手动控制线程细节,.NET内置的Parallel.For能直接实现“并行执行+等待全部完成”的逻辑,无需手动管理线程:
Parallel.For(0, 25, i => { Program x = new Program(); x.doSomething(someParameter); }); // 这里直接写后续代码,Parallel.For会自动等待所有并行任务结束
方法3:使用Task(现代异步推荐方案)
如果是.NET Framework 4.0及以上版本,更推荐用Task实现,比直接操作Thread更灵活,也能轻松等待所有任务完成:
同步等待版本
List<Task> tasks = new List<Task>(); for(int i = 0; i < 25; i ++) { Program x = new Program(); Task task = Task.Run(() => x.doSomething(someParameter)); tasks.Add(task); } // 等待所有任务完成 Task.WaitAll(tasks.ToArray()); // 后续代码
异步等待版本(适用于异步上下文)
async Task RunAllTasks() { List<Task> tasks = new List<Task>(); for(int i = 0; i < 25; i ++) { Program x = new Program(); tasks.Add(Task.Run(() => x.doSomething(someParameter))); } await Task.WhenAll(tasks); // 后续代码 }
内容的提问来源于stack exchange,提问作者rogic
相关产品推荐
相关产品推荐

