2013-11-14 2 views
20

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

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

+4

Http: //blogs.msdn .com/b/dotnet/archive/2012/06/06/async-in-4-5-enable-progress-and-cancel-in-async-apis.aspx – vittore

+1

http://simplygenius.net/Article/AncillaryAsyncProgress – Thomas

+0

[Асинхронный шаблон на основе задач] (http://msdn.microsoft.com/en-us/libr ary/hh873175 (v = vs.110) .aspx) объясняет, как это сделать. –

ответ

30

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

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 ...)); 
} 
+0

ваш код в порядке, но как я могу показать несколько индикаторов выполнения для многократной загрузки файла с помощью справочной строки status.need. спасибо – Thomas

+1

@Thomas Ваш UploadAndProcessAsync сам должен следовать той же схеме и иметь аргумент 'IProgress progress'. – vittore

+4

не очень чистый. это будет действительно полезно, если вы дадите мне свое драгоценное время для завершения кода. предположим, что у imageList есть 3 имени файла, и я хочу показать для него три уровня прогресса. поэтому просто расскажите мне, как я могу добавить 3 progressbar, а также обновить статус progressbar из функции UploadPicturesAsync(). Я не знаю, что такое IProgress и как он работает. благодаря – Thomas

Смежные вопросы