c# - 计算 Parallel.ForEach 使用的线程数

标签 c# .net multithreading .net-4.0 task-parallel-library

如何确定在 Parallel.ForEach 的特定调用期间使用的线程数(或 Parallel.Invoke ,或 Parallel.For )

我知道如何限制最大线程数,例如

Parallel.ForEach(myList, 
                 new ParallelOptions { MaxDegreeOfParallelism = 4 },
                 item => { doStuff(item); });

我知道除了当前线程之外,Task.Parallel 库还使用一些启发式方法来确定在运行时使用的额外线程池线程的最佳数量; 0 和 MaxDegreeOfParallelism 之间的某个值。

我想知道实际使用了多少线程,用于记录目的:
Stopwatch watch = Stopwatch.StartNew();
Parallel.ForEach(myList, item => { doStuff(item); });
trace.TraceInformation("Task finished in {0}ms using {1} threads", 
       watch.ElapsedMilliseconds, NUM_THREADS_USED); 

我主要是为了好奇而记录这些数据,并提高我的理解。它不必是 100% 可靠的,因为我不打算将它用于其他任何用途。

有没有办法在没有重大性能损失的情况下获得这个数字?

最佳答案

您可以使用(线程安全)列表来存储使用线程的 ID 并对其进行计数:

ConcurrentBag<int> threadIDs = new ConcurrentBag<int>();
Parallel.ForEach(myList, item => { 
    threadIDs.Add(Thread.CurrentThread.ManagedThreadId);
    doStuff(item); 
});

int usedThreads = threadIDs.Distinct().Count();

这确实会影响性能(尤其是 ConcurrentBag 的线程安全逻辑),但我不知道这有多大。相对效果取决于工作量doStuff做自己。如果该方法只有几个命令,则此线程计数解决方案甚至可能会更改已使用线程的数量。

关于c# - 计算 Parallel.ForEach 使用的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47331696/

相关文章:

C#(仅限语言)编译器

c# - Json 与 .NET 和 C#?

c# - MVC 新窗口瓶颈

c# - 将 TextBox 多绑定(bind)值绑定(bind)到另一个属性

c# - 使用 (int) 和 Convert.ToInt(32) 将 double 转换为 int 不同的结果

c# - 您对这种数据库工作有何看法?

Ruby 线程和互斥量

c++ - C/C++ 当 select 挂起时将套接字添加到 fd_set

c# - BindingList.Add() 即使有锁也不能跨线程工作

c# - 使用 Web 服务检索大数据时出现内存不足异常