valid - summary documentation c#
El trabajador de fondo no reportará el progreso (6)
Tengo un trabajador de fondo ejecutando una tarea de base de datos larga. Quiero mostrar la barra de progreso mientras la tarea se está ejecutando. De alguna manera, el trabajador de fondo no informará el progreso de la tarea.
Esto es lo que tengo:
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;
}
Estoy haciendo esto en WPF, pero supongo que no hará una diferencia.
Gracias por adelantado
Debe dividir su método DoWork en un progreso reportable y luego llamar a ReportProgress.
Tomemos, por ejemplo, lo siguiente:
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 su trabajo no puede ser predeterminado, intente agregar sus propios porcentajes:
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);
}
Debe llamar a worker.ReportProgress (percentComplete) en su método DoWork. percentComplete debe calcularse en función del trabajo total. Por ejemplo:
for(int i =0; i != 100; i++) {
// do something
worker.ReportProgress(i);
}
A veces es difícil dividir un trabajo en varios trozos para poder informar el progreso. Desafortunadamente, el BackgroundWorker no resuelve esto, tienes que hacerlo tú mismo.
El progreso debe enviarse desde el evento DoWork llamando al método ReportProgress en BackgroundWorker. En su caso, no puede reportar ningún progreso porque todo el trabajo se está haciendo fuera de la función DoWork. Solo puede informar el progreso antes y después de la llamada a getdate (), pero no durante la llamada, ya que el subproceso de BackgroundWorker está ocupado.
Modifique la propiedad WorkReportProgress del objeto backgroundworker a true en la ventana de propiedades o en el código.
Tienes que llamar manualmente ReportProgress ReportProgress()
para activar el evento ProgressChanged .
acaba de informar el progreso en el evento Dowork
private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) {
int progresValue0to100 = 75;
(sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100);
//do your jobs..
}
funciona así