title: Is Wait() necessary after using Task.Factory.StartNew()?
body: <p>Almost all documentation that I have seen on using the C# 4.0 Task.Factory.StartNew states that in order to wait for the Task to complete, you need a Wait.  But my initial testing shows that it is unnecessary.  Can anyone else give me confirmation on this?  I'm curious as to why so much online and printed references say you should call Wait.</p>
  
  <p>Here's a simple console app that shows that I don't need the Wait statement, so I commented it out.  Whether or not I comment out the tsk.Wait(), the output is the same.</p>
  
  <p>Expected output in all cases is as follows:</p>
  
  <pre>
  Main thread starting.
  After running MyTask. The result is True
  After running SumIt. The result is 1
  Main thread ending.
  </pre>
  
  <p>The code:</p>
  
  <pre><code>class Program
  {
      // A trivial method that returns a result and takes no arguments.
      static bool MyTask()
      {
          Thread.Sleep(2000);
          return true;
      }
  
      // This method returns the summation of a positive integer
      // which is passed to it.
      static int SumIt(object v)
      {
          int x = (int)v;
          int sum = 0;
          for (; x &gt; 0; x--)
              sum += x;
          return sum;
      }
  
      static void Main(string[] args)
      {
          Console.WriteLine("Main thread starting.");
          // Construct the first task.
          Task&lt;bool&gt; tsk = Task&lt;bool&gt;.Factory.StartNew(() =&gt; MyTask());
          // I found this Wait statement to be completely unnecessary.
          //tsk.Wait();
          Console.WriteLine("After running MyTask. The result is " +
          tsk.Result);
          // Construct the second task.
          Task&lt;int&gt; tsk2 = Task&lt;int&gt;.Factory.StartNew(() =&gt; SumIt(1));
          Console.WriteLine("After running SumIt. The result is " +
          tsk2.Result);
          tsk.Dispose();
          tsk2.Dispose();
          Console.WriteLine("Main thread ending.");
          Console.ReadLine();
      }
  }
  </code></pre>