title: Task.Run and UI Progress Updates
body: <p>This code snippet is from <a href="http://blog.stephencleary.com/2013/09/taskrun-vs-backgroundworker-round-5.html" rel="noreferrer">Stephen Cleary's blog</a> and gives an example of how to report progress when using Task.Run. I would like to know why there are no cross thread issues with updating the UI, by which I mean why is invoke not required? </p>
  
  <pre><code>private async void button2_Click(object sender, EventArgs e)
  {
      var progressHandler = new Progress&lt;string&gt;(value =&gt;
      {
          label2.Text = value;
      });
      var progress = progressHandler as IProgress&lt;string&gt;;
      await Task.Run(() =&gt;
      {
          for (int i = 0; i != 100; ++i)
          {
              if (progress != null)
                  progress.Report("Stage " + i);
              Thread.Sleep(100);
          }
      });
      label2.Text = "Completed.";
  }
  </code></pre>