title: Async Progress Bar Update
body: <p>I am trying to use an <code>async await</code> to update a progress bar on my WinForm based on a copy operation, but the progress bar will only update when the <code>Copy</code> function has finished, and then throws an exception that it can't update as it's not on the same thread?</p>
  
  <p>The Copy function doesn't need to interact with the UI but the Progress function does.</p>
  
  <p>The UI isn't blocked though, so it would appear the async part is working as expected, it's just interacting with the UI thread that isn't.</p>
  
  <pre><code>long fileProgress = 0;
  long totalProgress = 0;
  bool complete = false;
  
  CopyFileEx.CopyFileCallbackAction callback(FileInfo source, FileInfo destination, object state, long totalFileSize, long totalBytesTransferred)
  {
        fileProgress = totalBytesTransferred;
        totalProgress = totalFileSize;
        return CopyFileEx.CopyFileCallbackAction.Continue;
  }
  
  async Task Progress()
  {
        await Task.Run(() =&gt;
        {
             while (!complete)
             {
                  if (fileProgress != 0 &amp;&amp; totalProgress != 0)
                  {
                       fileProgressBar.Value = (int)(fileProgress / totalProgress) * 100;
                  }
             }
        });
  }
  
  private async void startButton_Click(object sender, EventArgs e)
  {
        Copy();
        await Progress();
        MessageBox.Show("Done");
  }
  
  void Copy()
  {
        Task.Run(() =&gt;
        {
             CopyFileEx.FileRoutines.CopyFile(new FileInfo(@"C:\_USB\Fear.rar"), new FileInfo(@"H:\Fear.rar"), CopyFileEx.CopyFileOptions.All, callback, null);
             complete = true;
        });
  }
  </code></pre>