2012-03-01 69 views
0

但是,在Windows任务管理器中,它只展示了只使用一个特定的内核,我认为下列方法将线程分配给多核处理器以执行任务。如何使这5个线程平行?ThreadPool中的C#并行线程

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) 
    { 
     ... 
    } 
} 
+0

我想这里http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core你会找到答案。 – 2012-03-01 08:26:44

+0

第一次简单的检查 - 你在任务管理器中看到哪个线程的数量?线程到内核的分配是操作系统的一部分,而不是应用程序。 – weismat 2012-03-01 08:31:17

+0

为什么在已经在线程池中执行的代码中使用'Parallel.For'? – Tudor 2012-03-01 10:19:21

回答

1

很难说从这段代码。你甚至有2层并行,所以“它应该工作”。

答案必须在// Process: Process a tasks - 它可能挂在一个共同的,非共享的资源上。

如果'tasks'中的代码是独立的且CPU密集型的,您应该看到所有内核都忙碌。但是当你尝试用Sleep()来模拟它时,你不会在TaskManager中看到任何事情发生。

+0

你只是让我使用任务。我将尝试它。我会在稍后分享我的结果。谢谢。 – Fusionmate 2012-03-02 12:32:35