Подтвердить что ты не робот

Как сделать отчет о ходе работы с помощью Async/Await

Предположим, у меня есть список файлов, которые мне нужно скопировать на веб-сервер, используя связанные с ftp классы в проекте С#. здесь я хочу использовать функцию Async/Await, а также хочу показать несколько индикаторов выполнения для одновременной загрузки нескольких файлов. каждый индикатор выполнения указывает каждый статус загрузки файла. так что назовите меня, как я могу это сделать.

когда мы работаем с фоновым работником, чтобы делать такую ​​работу, это очень просто, потому что у фонового работника есть событие изменения прогресса. поэтому как справиться с такой ситуацией с помощью Async/Await. если возможно, посоветуйте мне пример кода. спасибо

4b9b3361

Ответ 1

Пример кода с прогрессом из статьи

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 async Task<int> 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 ...));
}