【问题标题】:How can I see the number of threads raised in a Parallel.ForEach loop?如何查看 Parallel.ForEach 循环中引发的线程数?
【发布时间】:2017-08-10 09:59:07
【问题描述】:

给定这样的场景,在低功耗机器上运行:

var logFile = File.ReadAllLines("logpath");
var logList = new List<string>(logFile);

Parallel.ForEach(logList.Batch(8), fileLine =>
{
    // work on the 8 lines
});

有没有一种简单的方法可以找出 Parallel.ForEach 进程中产生的最大并发线程数?

【问题讨论】:

  • "ThreadPool.GetAvailableThreads()" 给出池线程的最大数量和当前活动的线程之间的差异。没试过,但值得一试。
  • @RenéVogt 是的,这正是我希望通过 ThreadPool 之类的内置跟踪的原因。
  • 检查可用线程与已用线程的问题是:在哪个点/哪个线程应该要求这些数字。当然,您处理的其他线程使用什么......所以我认为您不会以这种方式获得确切的值。
  • 最大的问题当然是为什么你想知道这个......你可以(应该)对结果做些什么。
  • @HenkHolterman 我主要想知道是否可以通过添加更多内核来加快速度,或者它是否已经满负荷运行。

标签: c# multithreading parallel-processing


【解决方案1】:

使用 Console.WriteLine 或 Logging 跟踪循环中的每个线程。

Parallel.ForEach(logList.Batch(8), fileLine =>
{

    // work on the 8 lines
    Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId);

});

【讨论】:

  • 当然我不介意你使用这个“想法”,但重要的部分是如何实现它。您展示的方式可能有利于测试/研究目的。但是如果 OP 需要一个高效的解决方案,棘手的部分是将 ID 存储在锁定开销最小的地方(因为并发线程将访问该 ID 存储)。
  • @RenéVogt 没错。另外,我想完成循环并查看在任何时候运行的最高线程数。很抱歉,最初的问题没有说清楚。
猜你喜欢
  • 2015-11-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多