C#线程嵌套实现方法及多请求多供应商并发处理问询
在C#中实现多请求多供应商的并行处理完整方案
嘿,针对你提出的「同时将3个不同请求发送给所有供应商」的需求,我来给你梳理下完整的实现方案——正好可以基于你已有的单请求多供应商并行逻辑扩展,不用重构太多代码!
核心思路
其实你的需求本质是把「单请求→多供应商」的并行逻辑,复制到多个请求上,再把所有任务统一管理。核心步骤就是:
- 把每个请求对应的所有供应商调用都包装成独立的异步/并行任务
- 将所有任务汇总到一个任务列表
- 等待所有任务完成后统一处理结果
完整可运行代码
假设你已经准备好:
- 三个不同的请求实例(比如
requestA、requestB、requestC) - 供应商列表
suppliers - 请求超时时间
SuppliersRequestTimespan
// 第一步:把所有需要处理的请求放到一个集合里 var targetRequests = new[] { requestA, requestB, requestC }; // 第二步:生成所有需要执行的任务——遍历每个请求,对每个请求并行调用所有供应商 var allTasks = targetRequests .SelectMany(currentRequest => suppliers.AsParallel() // 这里保持你原来的并行度设置,也可以根据服务器性能调整上限,比如.WithDegreeOfParallelism(8) .WithDegreeOfParallelism(suppliers.Count()) .Select(supplier => supplier.GetResponse(currentRequest, SuppliersRequestTimespan)) ) .ToList(); // 第三步:等待所有任务完成——异步场景优先用await,同步场景用Task.WaitAll await Task.WhenAll(allTasks); // 同步方法里替换成 Task.WaitAll(allTasks); // 第四步:提取所有结果 var allSupplierResponses = allTasks.Select(task => task.Result).ToArray();
进阶优化与说明
- 异步优先原则:如果你的业务方法是异步的,一定要用
await Task.WhenAll,别用Task.WaitAll——后者会阻塞当前线程,容易导致线程池资源浪费甚至死锁。 - 并行度控制:如果供应商数量特别多(比如几十上百个),别直接用
suppliers.Count()作为并行度上限,建议设置一个合理的固定值(比如10),避免一次性创建过多线程拖垮服务器。 - 分组管理结果:如果你需要区分「每个请求对应的供应商响应」,可以用下面的写法,结果会按请求分组,更便于后续业务处理:
var targetRequests = new[] { requestA, requestB, requestC }; var groupedResponse = new List<(object Request, IEnumerable<YourResponseType> SupplierResponses)>(); foreach (var req in targetRequests) { var supplierTasks = suppliers.AsParallel() .Select(supplier => supplier.GetResponse(req, SuppliersRequestTimespan)) .ToArray(); await Task.WhenAll(supplierTasks); // 把当前请求和它的所有供应商响应绑定在一起 groupedResponse.Add((req, supplierTasks.Select(t => t.Result))); } // 之后你可以遍历groupedResponse,逐个处理每个请求的供应商结果
- 异常处理:如果某个供应商请求失败不想影响其他任务,可以在生成任务时单独捕获异常,或者在遍历结果时检查
task.IsFaulted属性,针对性处理错误。
这样整个逻辑就完整了,既复用了你原来的并行处理逻辑,又满足了多请求同时发送的需求~
内容的提问来源于stack exchange,提问作者Sabi007
相关产品推荐
相关产品推荐

