title: What is the best practice for running multiple background tasks
body: <p>I have a Windows Service (.NET 4.5.2) which should run multiple tasks in the background while I want to use the System.Threading.Tasks which of the following implementation you are considering best practice? Or am I completely wrong?</p>
  
  <p><strong>Scenario 1:</strong></p>
  
  <pre><code>protected override void OnStart(string[] args)
  {
      // Assume all tasks implemented the same way.
      // I believe we shouldn't await the tasks in this scenario.
      var token = this._cancellationTokenSource.Token;
      this.RunTask1(token);
      this.RunTask2(token);
      this.RunTask3(token);
  }
  
  private async Task RunTask1(CancellationToken token)
  {
      var telebot = new Telebot("SOMETHING");
      while( true )
      {
          // Some work...
          // I/O dependent task.
          var response  = await telebot.GetUpdatesAsync(cancellationToken: token);
  
          //
          // Some other work
          // maybe some database calls using EF async operators.
          //
          await Task.Delay(TimeSpan.FromSeconds(1), token);
      }
  }
  </code></pre>
  
  <p><strong>Scenario 2:</strong></p>
  
  <pre><code>protected override void OnStart(string[] args)
  {
      // Assume all tasks implemented the same way.
      // I believe we shouldn't await the tasks in this scenario.
      var token = this._cancellationTokenSource.Token;
      this.RunTask1(token);
      this.RunTask2(token);
      this.RunTask3(token);
  }
  
  private void RunTask1(CancellationToken token)
  {
      Task.Factory.StartNew(async () =&gt;
          {
              var telebot = new Telebot("SOMETHING");
              while( true )
              {
                  // Some work...
                  // I/O dependent task.
                  var response = await telebot.GetUpdatesAsync(cancellationToken: token);
  
                  //
                  // Some other work
                  // may be some database calls using EF async operators.
                  //
                  await Task.Delay(TimeSpan.FromSeconds(1), token);
              }
          }, token);
  }
  </code></pre>