如何并行执行Calculate_Data列表中对象的StartCalculate方法?
实现并行执行StartCalculate()方法
要让所有Calculate_Data对象的StartCalculate()方法尽可能同时启动执行,你可以根据StartCalculate()的方法类型选择以下方案:
方案1:如果StartCalculate()是同步方法
如果StartCalculate()是同步的耗时方法(比如CPU密集型计算或阻塞式IO操作),可以用Task.Run将每个方法调用包装成独立任务,再通过Task.WhenAll等待所有任务完成。这种方式会把所有任务提交到线程池,实现近似同时启动的效果:
// 建议将原async void改为async Task,避免async void的潜在问题(无法捕获异常、无法等待执行完成等) public async Task StartCalculatingAsync() { // 为每个对象创建任务并提交到线程池(此时任务已进入调度队列开始执行) var calculateTasks = ListOfDataToCalculate .Select(data => Task.Run(() => data.StartCalculate())) .ToList(); // 等待所有任务完成(不在意任务结束顺序) await Task.WhenAll(calculateTasks); }
方案2:如果StartCalculate()是异步方法
如果StartCalculate()本身是异步方法(返回Task或Task<T>),无需额外用Task.Run包装,直接收集所有任务并等待即可:
public async Task StartCalculatingAsync() { var calculateTasks = ListOfDataToCalculate .Select(data => data.StartCalculate()) .ToList(); await Task.WhenAll(calculateTasks); }
补充说明
- 关于"同时启动":严格来说CPU无法让所有任务绝对同时执行,但上述方案会让所有任务几乎同时进入调度队列,完全满足你"替代串行执行"的需求。
- 替换async void:原代码中的
async void仅适合事件处理场景,其他业务逻辑建议使用async Task,这样调用方可以等待计算完成,也能捕获执行过程中的异常。 - 控制并行度(可选):如果任务数量极大或为CPU密集型操作,可通过限制并行度避免资源过载。比如使用
Parallel.ForEach(更适合CPU密集型任务):public void StartCalculating() { // 可通过ParallelOptions指定最大并行度,比如设为CPU核心数 var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }; Parallel.ForEach(ListOfDataToCalculate, options, data => data.StartCalculate()); }
内容的提问来源于stack exchange,提问作者Hoihoi2022
相关产品推荐
相关产品推荐

