29

C# プロジェクトで ftp 関連のクラスを使用して Web サーバーにコピーする必要があるファイルのリストがあるとします。ここでは、非同期/待機機能を使用し、同時に複数のファイルをアップロードするために複数の進行状況バーを表示したいと考えています。各プログレス バーは、各ファイルのアップロード ステータスを示します。どうすればこれを行うことができるか教えてください。

バックグラウンド ワーカーと連携してこの種の作業を行う場合、バックグラウンド ワーカーには進行状況の変更イベントがあるため、非常に簡単です。この種の状況を Async/Await で処理する方法。可能であれば、サンプル コードを教えてください。ありがとう

4

1 に答える 1

37

記事からの進行状況を示すコード例

public async Task<int> UploadPicturesAsync(List<Image> imageList, 
     IProgress<int> progress)
{
      int totalCount = imageList.Count;
      int processCount = await Task.Run<int>(() =>
      {
          int tempCount = 0;
          foreach (var image in imageList)
          {
              //await the processing and uploading logic here
              int processed = await UploadAndProcessAsync(image);
              if (progress != null)
              {
                  progress.Report((tempCount * 100 / totalCount));
              }
              tempCount++;
          }
          return tempCount;
      });
      return processCount;
}

private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
    int uploads=await UploadPicturesAsync(GenerateTestImages(),
        new Progress<int>(percent => progressBar1.Value = percent));
}

各ファイルを個別にレポートしたい場合は、IProgress のベース タイプが異なります。

public Task UploadPicturesAsync(List<Image> imageList, 
     IProgress<int[]> progress)
{
      int totalCount = imageList.Count;
      var progressCount = Enumerable.Repeat(0, totalCount).ToArray(); 
      return Task.WhenAll( imageList.map( (image, index) =>                   
        UploadAndProcessAsync(image, (percent) => { 
          progressCount[index] = percent;
          progress?.Report(progressCount);  
        });              
      ));
}

private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
    int uploads=await UploadPicturesAsync(GenerateTestImages(),
        new Progress<int[]>(percents => ... do something ...));
}
于 2013-11-14T14:24:17.023 に答える