2013-08-21 3 views
0

Индикатор хода повторяется два или три раза, прежде чем завершить операцию на BackgroundWorkerReportProgress в BackgroundWorker

этот код:

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    'Load Data 
    For i As Integer = 0 To ListData.Count 
     BackgroundWorker1.ReportProgress((i/ListData.Count) * 100) 
    Next 
    If BackgroundWorker1.CancellationPending Then 
     e.Cancel = True 
    End If 
End Sub 

Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
    Me.ProgressBar1.Value = e.ProgressPercentage 
End Sub 

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 

    'set datasource of DatagridView 
    ProgressBar1.Style = ProgressBarStyle.Blocks 

End Sub 

В моей форме нагрузки

BackgroundWorker1.WorkerReportsProgress = True 
    BackgroundWorker1.WorkerSupportsCancellation = True 
    BackgroundWorker1.RunWorkerAsync() 
    ProgressBar1.Style = ProgressBarStyle.Marquee 

Пожалуйста, помогите мне

ответ

2

У вас есть несколько ошибок. Во-первых, если вы намерены отображать увеличивающийся индикатор выполнения, вы должны использовать:

ProgressBar1.Style = ProgressBarStyle.Continuous 

в вашей форме загрузки. Затем вы проверяете BackgroundWorker1.CancellationPending только после прохождения всего своего ListData. Это слишком поздно, вы должны проверять каждую итерацию цикла. Я также сомневаюсь, что вы хотите, чтобы ваш цикл прошел от 0 до ListData.Count; вы, вероятно, либо хотите начать с 1, либо перейти на ListData.Count - 1. Я не могу сказать по вашему вопросу. Ваш цикл должен выглядеть следующим образом:

For i as Integer = 0 To ListData.Count - 1 
    If BackgroundWorker1.CancellationPending Then 
     e.Cancel = True 
     Exit For 
    Else 
     ' You should be doing some work here, not just calling ReportProgress 
     BackgroundWorker1.ReportProgress(100 * (i+1)/ListData.Count) 
    End If 
Next 

Другая ошибка вычисления (i/ListData.Count) * 100; i и ListData.Count - целые числа, поэтому их деление всегда будет равным нулю до конца, когда оно будет 1. Вместо этого умножьте числитель на 100, чтобы получить проценты.

+0

Я предполагаю, что цикл 'For' должен идти от' 1' до 'ListData.Count'; в противном случае первая итерация указывает, что никакая работа не была выполнена ('100 * 0/ListData.Count' равно нулю). –

+0

Dour, спасибо. mm какой стиль для progressbar положить на BackgroundWorker1_RunWorkerCompleted ?? – Wfgo

+0

Хорошая оценка @ Карл, вопрос неоднозначен. Я изменил его, чтобы перейти от '0' к' ListData.Count-1'. –

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