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

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();

进阶优化与说明

  1. 异步优先原则:如果你的业务方法是异步的,一定要用await Task.WhenAll,别用Task.WaitAll——后者会阻塞当前线程,容易导致线程池资源浪费甚至死锁。
  2. 并行度控制:如果供应商数量特别多(比如几十上百个),别直接用suppliers.Count()作为并行度上限,建议设置一个合理的固定值(比如10),避免一次性创建过多线程拖垮服务器。
  3. 分组管理结果:如果你需要区分「每个请求对应的供应商响应」,可以用下面的写法,结果会按请求分组,更便于后续业务处理:
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,逐个处理每个请求的供应商结果
  1. 异常处理:如果某个供应商请求失败不想影响其他任务,可以在生成任务时单独捕获异常,或者在遍历结果时检查task.IsFaulted属性,针对性处理错误。

这样整个逻辑就完整了,既复用了你原来的并行处理逻辑,又满足了多请求同时发送的需求~

内容的提问来源于stack exchange,提问作者Sabi007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:07:14