我有一个Windows服务,代码类似于以下内容:
List<Buyer>() buyers = GetBuyers();
var results = new List<Result();
Parallel.Foreach(buyers, buyer =>
{
// do some prep work, log some data, etc.
// call out to an external service that can take up to 15 seconds each to return
results.Add(Bid(buyer));
}
// Parallel foreach must have completed by the time this code executes
foreach (var result in results)
{
// do some work
}
这份代码运行良好,但我认为我们存在可拓展性问题。我们每分钟平均有20-30个入站连接,并且每个连接都会触发这段代码。对于每个入站连接,“购买者”集合中可能会有1-15个购买者。偶尔我们的入站连接数会激增到每分钟100多个,导致服务器停滞。
两台负载均衡8核服务器的 CPU 使用率仅约为50%,但线程数继续增加(在进程上达到350个),每个入站连接的响应时间从3-4秒变为1.5-2分钟。
我怀疑以上代码是我们可拓展性问题的原因。鉴于此使用情况(用于 I/O 操作的并行性)在 Windows 服务(无 UI)上,Parallel.ForEach 是否是最佳方法?我没有太多异步编程经验,期望利用这个机会学习更多,想从这里开始获取一些社区建议来补充我在 Google 上找到的信息。
Parallel.For
,因为大部分线程将会被阻塞,导致线程池创建新的线程。如果是IO操作,请使用异步操作。 - Brian RasmussenParallel.ForEach(list, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount, }, parallelAction);
吗? - ziddarth