2009-05-12 12 views
17

Mam pracownika tła pracującego z długim zadaniem bazy danych. Chcę wyświetlać pasek postępu podczas wykonywania zadania. W jakiś sposób pracownik działający w tle nie będzie informował o postępie zadania.Backgroundworker nie będzie raportował postępu

To jest to, co mam:

BackgroundWorker _bgwLoadClients; 

_bgwLoadClients = new BackgroundWorker(); 
_bgwLoadClients.WorkerReportsProgress = true; 
_bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoadClients_DoWork); 
_bgwLoadClients.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgwLoadClients_RunWorkerCompleted); 
_bgwLoadClients.ProgressChanged += new ProgressChangedEventHandler(_bgwLoadClients_ProgressChanged); 
_bgwLoadClients.RunWorkerAsync(parms); 

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) 
{ 
    DataTable dt = getdate(); 
    e.Result = dt; 
} 

void _bgwLoadClients_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

Robię to w WPF, ale myślę, że nie będzie różnicy.

góry dzięki

+2

Jeśli wciskasz kod o cztery spacje podczas pisania (edytowania) pytania, będzie on wyświetlany z wcięciem i formatowaniem, jak kod, a nie wyciskany w akapicie i trudny do odczytania. –

+0

Wygląda na to, że nie wywołujesz metody .ReportProgress w BackgroundWorker - czy po prostu pokazuje nam się uproszczony kod? – Mike

+0

@Mike, myślę, że to raczej powód niż edycja edytora. –

Odpowiedz

30

Musisz przerwać swoją metodę DoWork w raportowany postęp, a następnie wywołać ReportProgress.

Weźmy na przykład następujące:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // If possible, establish how much there is to do 
    int totalSteps = EstablishWorkload(); 

    for (int i=0; i<totalSteps; i++) 
    { 
     // Do something... 

     // Report progress, hint: sender is your worker 
     (sender as BackgroundWorker).ReportProgress((int)(100/totalSteps)*i, null); 
    } 

} 

Jeśli praca nie może być ustalona, ​​spróbuj dodać własne procentowe:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // some work 

    (sender as BackgroundWorker).ReportProgress(25, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(50, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(60, null); 

    // some work 

    (sender as BackgroundWorker).ReportProgress(99, null); 
} 
+6

Ładne programowanie, zła matematyka ;-) (int) (100.0/totalSteps * i) –

2

tylko sprawozdanie z postępów w DoWork imprezy

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) { 
    int progresValue0to100 = 75; 
    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100); 
    //do your jobs.. 
} 

To działa tak

3

Musisz wywołać metodę worker.ReportProgress (percentComplete) w swojej metodzie DoWork. percentComplete należy obliczyć na podstawie łącznej pracy. Na przykład:

for(int i =0; i != 100; i++) { 
    // do something 
    worker.ReportProgress(i); 
} 

Czasami trudno podzielić zadanie na kilka części, aby można było zgłosić postęp. Niestety BackgroundWorker nie rozwiązuje tego problemu, musisz to zrobić sam.

2

Progress muszą być wysyłane z poziomu zdarzenia DoWork wywołując metoda ReportProgress na BackgroundWorker. W twoim przypadku nie możesz zgłaszać żadnych postępów, ponieważ cała praca jest wykonywana poza funkcją DoWork. Możesz raportować postępy przed i po wywołaniu getdate(), ale nie podczas połączenia, ponieważ wątek BackgroundWorker jest zajęty.

9

Modyfikacja WorkReportProgress właściwość obiektu BackgroundWorker prawdziwej albo w oknie Właściwości lub w kodzie.