如何让C#的SomeRequests方法并行执行3次后再运行OtherMethod?
解决方案
要实现SomeRequests并行执行3次,全部完成后再运行OtherMethod,可以根据SomeRequests的类型(同步/异步)选择不同的实现方式:
场景1:SomeRequests是同步方法
如果SomeRequests是无返回值的同步方法,可通过以下两种方式实现并行执行:
方式1:使用Parallel.Invoke
Parallel.Invoke会自动处理并行调度,等待所有传入的委托执行完成后才继续后续代码:
static void Main(string[] args) { Codes(); Console.ReadKey(); } private static void Codes() { while (true) { // 并行执行3次SomeRequests,全部完成后才继续 Parallel.Invoke( () => SomeRequests(), () => SomeRequests(), () => SomeRequests() ); OtherMethod(); } }
方式2:使用Task.WaitAll
通过Task.Run将同步方法包装为任务,再用Task.WaitAll等待所有任务完成:
static void Main(string[] args) { Codes(); Console.ReadKey(); } private static void Codes() { while (true) { // 创建3个并行任务 var tasks = new List<Task>(); for (int i = 0; i < 3; i++) { tasks.Add(Task.Run(() => SomeRequests())); } // 等待所有任务完成 Task.WaitAll(tasks.ToArray()); OtherMethod(); } }
场景2:SomeRequests是异步方法(返回Task)
如果SomeRequests是异步方法(比如内部调用了异步HTTP请求),推荐使用async/await结合Task.WhenAll,这种方式不会阻塞线程,性能更优:
static async Task Main(string[] args) // Main方法改为async Task { await Codes(); Console.ReadKey(); } private static async Task Codes() { while (true) { // 创建3个异步任务并并行执行 var tasks = new List<Task>(); for (int i = 0; i < 3; i++) { tasks.Add(SomeRequests()); // 直接调用异步方法,无需Task.Run包装 } // 等待所有异步任务完成 await Task.WhenAll(tasks); OtherMethod(); } } // 假设SomeRequests是异步方法 private static async Task SomeRequests() { // 示例:异步请求逻辑 await Task.Delay(1000); // 模拟异步操作 }
关键说明
Parallel.Invoke适合简单的同步方法并行,内部会根据CPU核心数优化调度。- 异步场景下必须使用
await Task.WhenAll,避免阻塞主线程,同时确保所有异步操作完成后再执行OtherMethod。 - 原代码中的
for循环是串行执行,改造后通过并行API实现了真正的同时运行。
内容的提问来源于stack exchange,提问作者mahvettin
相关产品推荐
相关产品推荐

