2016-01-22 2 views
0

Я пытаюсь перевести старый проект из BackgroundWorker в async/await, но я действительно пытаюсь обновить progressbar. Я последовал за эту статью, но не может заставить его работать, как они делают:ProgressBar не обновляется с async-задачи

http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis.aspx

Вот мой код:

private async void btnStart_Click(object sender, EventArgs e) 
{ 
    btnStart.Enabled = false; 
    pb.Show(); 
    btnCancel.Enabled = true; 

    var progressIndicator = new Progress<int>(ReportProgress); 
    List<string> updates = Directory.GetFiles(txtInput.Text).ToList(); 

    try 
    { 
     await ProcessUpdates(updates, progressIndicator, _cts.Token); 
    } 
    catch (OperationCanceledException ex) 
    { 
     MessageBox.Show(ex.Message, "Operation Cancelled"); 
    } 

    btnStart.Enabled = true; 
    pb.Hide(); 
    btnCancel.Enabled = false; 


} 

async Task<int> ProcessUpdates(List<string> updatePaths, IProgress<int> progress, CancellationToken ct) 
{ 
    int total = updatePaths.Count; 

    for (int i = 0; i < updatePaths.Count; i++) 
    { 
     ct.ThrowIfCancellationRequested(); 

     string update = updatePaths[i]; 
     ssFile.Text = $"Processing update: {Path.GetFileName(update)}"; 

     using (Stream source = File.Open(update, FileMode.Open)) 
     using (Stream destination = File.Create(txtOutput.Text + "\\" + Path.GetFileName(update))) 
     { 
      await source.CopyToAsync(destination); 
     } 

     progress?.Report((i/total) * 100); 
    } 

    return total; 
} 

private void ReportProgress(int value) 
{ 
    pb.Value = value; 
} 

private void btnCancel_Click(object sender, EventArgs e) 
{ 
    _cts.Cancel(); 
} 

Где я буду неправильно? Это сводит меня с ума. Благодарю.

+0

Что именно не работает? Вы получаете сообщение об ошибке? Или индикатор прогресса не обновляется? –

+1

Извините, забыли довольно важный бит информации. Панель прогресса не обновляется, но остальная часть графического интерфейса (строка состояния). Индикатор прогресса даже не прыгает с 0-100, он просто ничего не делает. – tom982

ответ

5

(i/total) * 100 выполняет целочисленное деление, которое всегда усекает десятичную часть, в результате чего значение 0, потому что i меньше total.

Либо использовать float или изменить порядок операций: i * 100/total

+0

Большое вам спасибо. Я был убежден, что это было связано с асинксом, потому что я новичок в этом, когда на самом деле он смотрел на меня прямо в лицо. Теперь отлично. – tom982

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