2012-03-01 37 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