线程池中的C#并行线程

本文关键字:线程 并行 | 更新日期: 2023-09-27 18:26:09

I介绍了以下将线程分配到多核处理器以执行任务的方法,然而,在Windows任务管理器中,它显示仅使用一个特定的核心。如何使这5个线程平行?

private void ActivateProcess
{
   ...
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker1));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker2)); 
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker3));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker4));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker5));
}
...
private void Worker1(Object stateInfo)
{
    try
    {
        //for (int i = 0; i < _NumberOfLoop; i++)
        Parallel.For(0,(long)_NumberOfLoop, i =>
        {
            if (_ForceToStop)
                throw new System.ArgumentException(
                    "Force stop at WorkerThread 1", "Aborted");
            // Process: Process a tasks
            ...
        });
    }
    catch (Exception ex)
    {
        ...
    }
}

线程池中的C#并行线程

从这段代码中很难说。你甚至有两层并行性,所以"它应该起作用"。

答案必须在// Process: Process a tasks中——它可能挂在一个公共的、非共享的资源上。

如果"任务"中的代码是独立的并且占用CPU,那么您应该会看到所有核心都很忙。但是,例如,当你试图用Sleep()模拟它时,你不会在TaskManager中看到任何事情发生。