2013-03-20 3 views
3

В приведенном ниже примере _DisplayUsingThreads (timesToDisplay) действительно работают параллельно. В то время как другие два _DisplayUsingTasks и _DisplayUsingDelegates выполняют только 4 за раз (на четырехъядерном процессоре), а затем ждут секунды, прежде чем делать еще 4. Зачем?Задачи/Thread/Delegate.beginInvoke с Thread.Sleep()

public partial class Form1 : Form 
     { 
      public Form1() 
      { 
       InitializeComponent(); 
      } 
      delegate void DisplayDelegate(); 
      DisplayDelegate myDisplaySleep; 

      private void btnGo_Click(object sender, EventArgs e) 
      { 
       const int timesToDisplay = 50; 

       //_DisplayUsingDelegates(timesToDisplay); 
       //_DisplayUsingTasks(timesToDisplay); 
       //_DisplayUsingThreads(timesToDisplay); 
      } 

      private void _DisplayUsingTasks(int displayNumber) 
      { 
       for (int i = 0; i < displayNumber; i++) 
       { 
        Task task = new Task(DisplayIdSleep); 
        task.Start(); 
       } 

      } 

      private void _DisplayUsingThreads(int displayNumber) 
      { 
       for (int i = 0; i < displayNumber; i++) 
       { 
        Thread thread = new Thread(DisplayIdSleep); 
        thread.Start(); 
       } 
      } 
      private void _DisplayUsingDelegates(int displayNumber) 
      { 
       myDisplaySleep = DisplayIdSleep; 

       for (int i = 0; i < displayNumber; i++) 
       { 
        myDisplaySleep.BeginInvoke(null, null); 
       } 
      } 

      private void DisplayIdSleep() 
      { 
       Debug.WriteLine("Thread Id : {0}", Thread.CurrentThread.ManagedThreadId); 
       Thread.Sleep(1000); 
      } 

     } 

ответ

4

Это результат Task и BeginInvoke с использованием пула потоков потоков, в то время как создать свой собственный поток, хорошо, создает поток.

Добавить ThreadPool.SetMinThreads(50, 0); в btnGo_Click и следить за тем, что происходит.

+0

Как говорит Джейсон, основной пул потоков Windows преднамеренно ограничивает скорость, с которой могут создаваться новые потоки. Он делает это для смягчения плохих последствий одновременного запуска многих новых потоков. –

0

Количество операций, которые могут быть поставлены в очередь пула потоков, ограничено только доступной памятью; однако пул потоков ограничивает количество потоков, которые могут быть активны в процессе одновременно. Начиная с .NET Framework 4 размер пула потоков для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства.

Смежные вопросы