Question

J'ai un travailleur de fond en cours d'exécution d'une tâche de base de données à long. Je veux montrer la barre de progression alors que la tâche est en cours d'exécution. D'une certaine façon le travailleur de fond ne sera pas compte des progrès de la tâche.

est ce que j'ai:

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;
}

Je fais cela en WPF, mais je suppose que ce ne sera pas faire une différence.

Merci d'avance

Était-ce utile?

La solution

Vous devez briser votre méthode DoWork vers le bas en cours à déclaration puis appelez ReportProgress.

Prenons par exemple les éléments suivants:

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);
    }

}

Si votre travail ne peut être prédéterminée, essayez d'ajouter vos propres pourcentages:

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);
}

Autres conseils

Modifier WorkReportProgress de l'objet BackgroundWorker true soit dans la fenêtre de propriétés ou en code.

Vous devez appeler ReportProgress() pour relever le ProgressChanged événement .

Vous devez appeler worker.ReportProgress (percentComplete) dans votre méthode DoWork. percentComplete devrait être calculé sur la base du travail total. Par exemple:

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

Il est parfois difficile de diviser un travail en plusieurs morceaux pour être possible de signaler les progrès. Malheureusement, le BackgroundWorker ne résout pas cela, vous devez le faire vous-même.

rapport que des progrès sur l'événement DoWork

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

il fonctionne comme ceci

Les progrès doivent être envoyés à partir de l'événement DoWork en appelant la méthode de ReportProgress sur le BackgroundWorker. Dans votre cas, vous ne pouvez pas signaler tout progrès parce que tout le travail est fait en dehors de la fonction DoWork. Vous ne pouvez signaler des progrès avant et après l'appel à getDate (), mais pas pendant l'appel depuis le fil BackgroundWorker est occupé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top