Async Barre De Progression Mise À Jour

Je suis en train d'utiliser un async await de mettre à jour une barre de progression sur mon WinForm basé sur une opération de copie, mais la barre de progression ne mettra à jour que lorsque le Copy fonction a fini, et puis lève une exception qu'il ne peut pas mettre à jour car il n'est pas sur le même thread?

La fonction de Copie n'a pas besoin d'interagir avec l'INTERFACE utilisateur, mais les Progrès de la fonction.

L'INTERFACE utilisateur n'est pas bloqué, donc il semble que la async partie fonctionne comme prévu, c'est juste de l'interaction avec le thread d'INTERFACE utilisateur qui ne l'est pas.

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(() =>
      {
           while (!complete)
           {
                if (fileProgress != 0 && 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(() =>
      {
           CopyFileEx.FileRoutines.CopyFile(new FileInfo(@"C:\_USB\Fear.rar"), new FileInfo(@"H:\Fear.rar"), CopyFileEx.CopyFileOptions.All, callback, null);
           complete = true;
      });
}

OriginalL'auteur Bali C | 2016-03-31