title: c# multiple tasks do not run in parallel
body: <p>I tried to create a multithreaded dice rolling simulation - just for curiosity, the joy of multithreaded progarmming and to show others the effects of "random results" (many people can't understand that if you roll a laplace dice six times in a row and you already had 1, 2, 3, 4, 5 that the next roll is NOT a 6.). To show them the distribution of n rolls with m dice I created this code.</p>
  
  <p>Well, the result is fine BUT even though I create a new task for each dice the program runs single threaded.
  Multithreaded would be reasonable to simulate "millions" of rerolls with 6 or more dice as the time to finish will grow rapidly.</p>
  
  <p>I read several examples from msdn that all indicate that there should be several tasks running simultanously.
  Can someone please give me a hint, why this code does not utilize many threads / cores? (Not even, when I try to run it for 400 dice at once and 10 Million rerolls)</p>
  
  <p>At first I initialize the jagged Array that stores the results. 1st dimension: 1 Entry per dice, the second dimension will be the distribution of eyes rolled with each dice.</p>
  
  <p>Next I create an array of tasks that each return an array of results (the second dimension, as described above)
  Each of these arrays has 6 entries that represent eachs side of a laplace W6 dice. If the dice roll results in 1 eye the first entry [0] is increased by +1. So you can visualize how often each value has been rolled.</p>
  
  <p>Then I use a plain for-loop to start all threads. There is no indication to wait for a thread until all are started.</p>
  
  <p>At the end I wait for all to finish and sum up the results. It does not make any difference if change</p>
  
  <p>Task.WaitAll(tasks); to
  Task.WhenAll(tasks);</p>
  
  <p>Again my quation: Why doesn't that code utilize more than one core of my CPU? What do I have to change?</p>
  
  <p>Thanks in advance!</p>
  
  <p>Here's the code:</p>
  
  <pre><code>private void buttonStart_Click(object sender, RoutedEventArgs e)
      {      
          int tries = 1000000;
          int numberofdice = 20   ;
          int numberofsides = 6; // W6 = 6
          var rnd = new Random();
  
          int[][] StoreResult = new int[numberofdice][];
          for (int i = 0; i &lt; numberofdice; i++)
          {
              StoreResult[i] = new int[numberofsides];
          }
  
          Task&lt;int[]&gt;[] tasks = new Task&lt;int[]&gt;[numberofdice];
  
  
          for (int ctr = 0; ctr &lt; numberofdice; ctr++)
          {
  
              tasks[ctr] = Task.Run(() =&gt;
              {
                  int newValue = 0;
                  int[] StoreTemp = new int[numberofsides]; // Array that represents how often each value appeared
                  for (int i = 1; i &lt;= tries; i++) // how often to roll the dice
                  {
                      newValue = rnd.Next(1, numberofsides + 1); // Roll the dice; UpperLimit for random int EXCLUDED from range 
                      StoreTemp[newValue-1] = StoreTemp[newValue-1] + 1; //increases value corresponding to eyes on dice by +1
                  }
                  return StoreTemp;
              });
                  StoreResult[ctr] = tasks[ctr].Result; // Summing up the individual results for each dice in an array
  
          }
          Task.WaitAll(tasks);
  
            // do something to visualize the results - not important for the question
  
          }
      }
  </code></pre>