【问题标题】:Thread pool - 10 phreads created?线程池 - 创建了 10 个线程?
【发布时间】:2020-01-06 01:12:50
【问题描述】:

我正在创建一个应用程序来处理要处理的大量数据。我想在 C# 中使用线程只是为了让它处理得更快。请参阅下面的示例代码。

private static void MyProcess(Object someData)
{      
     //Do some data processing       
}

static void Main(string[] args)
{
     for (int task = 1; task < 10; task++)
     {
         ThreadPool.QueueUserWorkItem(new WaitCallback(MyProcess), task);
     }
}

这是否意味着每次将任务传递给“MyProcess”方法的循环都会创建一个新线程(总共 10 个线程)?另外,线程会并发处理吗?

【问题讨论】:

  • 为什么不在 Visual Studio 中调试时查看线程窗口?
  • 因为这是您的Main 方法(所以进程刚刚开始),是的,线程是新创建的(线程池“缓存”这些线程以防您以后想再次使用它们)。如果您有 10 个 cpu 核心,它们可能同时运行。
  • Parallel.For(1, 10, task =&gt; { ... })

标签: c# multithreading threadpool


【解决方案1】:

您的方法将排队 9 次(您从 1 开始,而不是 0 开始)等待执行,并将在 thredpool 线程可用时执行。

【讨论】:

    【解决方案2】:

    调用将被安排在线程池中。它不保证将创建 10 个线程,也不保证所有 10 个任务将同时执行。线程池中的线程数取决于硬件并自动选择以提供最佳性能。

    这篇文章很好地解释了它的工作原理:

    1. https://owlcation.com/stem/C-ThreadPool-and-its-Task-Queue-Example
    2. https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool?redirectedfrom=MSDN&view=netframework-4.8
    3. https://www.c-sharpcorner.com/article/thread-pool-in-net-core-and-c-sharp/

    这个 Stackoverflow 问题解释了 ThreadPool 和 Thread 之间的区别:
    Thread vs ThreadPool

    【讨论】:

      【解决方案3】:

      线程池将启动的线程数取决于多种因素,请参阅The managed thread pool

      基本上你在这里排队 10 个工作项目,它们可能会立即启动线程。

      线程最有可能同时运行,具体取决于机器和处理器数量。

      如果您启动大量工作项,它们将最终进入队列并在线程可用时立即开始运行。

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 2016-05-21
        • 2015-03-28
        • 2023-02-11
        • 2020-03-05
        相关资源
        最近更新 更多