c# - ¿Cómo iniciar un BackgroundWorker en un momento específico?
.net timer (6)
¿Lo necesita para correr exactamente cada cinco segundos o no más de cinco segundos ? Si es el último, puede llamar a Sleep(5000)
en el Thread.CurrentThread
justo antes de que su BackgroundWorker
finalice su método DoWork()
.
Tengo un problema al ejecutar un backgroundworker en un momento específico.
Mi código ejecuta al trabajador de backgound en solo un segundo.
Quiero aumentar el tiempo de intervalo en mi fondo.
Estoy usando esta línea de código para ejecutar un fondo en un botón, haga clic en Evento:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Luego en backgroundWorker1_DoWork
:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.CancelAsync();
}
Por fin en backgroundWorker1_RunWorkCompleted
:
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Quiero ejecutar el fondo de forma continua, pero por cada 5 segundos o más de 5.
Habría un gran aprecio si alguien pudiera ayudarme,
Gracias por adelantado.
¿No podrías usar un temporizador para iniciar tu BackgroundWorker
?
La solución más fácil sería dejar que el hilo duerma durante 5 segundos al comienzo de backgroundWorker1_DoWork
: Thead.Sleep(5000)
.
Alternativamente, puede configurar un temporizador en RunWorkerCompleted que expira en 5 segundos y luego inicia nuevamente el BackgroundWorker.
Si quieres usar BW prueba esto:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Thread.Sleep(5000);//wait for 5s then run it again
backgroundWorker1.RunWorkerAsync();
}
podría agregar un Timer
establezca el intervalo a la frecuencia con la que desea que se ejecute el trabajador de fondo y, en el caso de que transcurra el tiempo de los temporizadores, podría iniciar el trabajador en segundo plano.
Sin embargo, querrá verificar que el trabajador de segundo plano no esté ocupado antes de intentar reiniciarlo. Si ocurre esta situación, entonces podría considerar comenzar de inmediato al trabajador de fondo nuevamente cuando finalice. (si desea que se ejecute al menos una vez cada 5 segundos)
Si desea que espere 5 segundos después de la finalización, debe detener el temporizador antes de iniciar el trabajador en segundo plano, y en segundo plano el evento completado por los trabajadores debe reiniciar el temporizador y volver a iniciarlo.
EDITAR
después de uno de sus comentarios a continuación, parece que tiene muchos trabajadores en segundo plano, en cuyo caso usar uno de los otros enfoques que inserta un retraso en el evento de fondo realizado por los trabajadores antes de volver a iniciar el trabajo de fondo probablemente sea una mejor solución.
Podría insertar la demora usando Thread.Sleep()
como se ha sugerido o quizás podría crear un temporizador en la función y asignarle un delegado al evento transcurrido de temporizadores que reinició el trabajador en segundo plano. Algo a lo largo de estas líneas (no probadas):
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Timer timer = new Timer();
timer.Interval = 5000;
timer.Enabled = true;
timer.Elapsed+=delegate (object sender, ElapsedEventArgs args)
{
backgroundWorker1.RunWorkerAsync();
};
timer.Start ();
}
Tiempo de ejecución
La clase de temporizador representa un control de temporizador y se utiliza para crear un temporizador en tiempo de ejecución. El siguiente fragmento de código crea un temporizador en tiempo de ejecución, establece su propiedad y controlador de eventos.
Timer t = new Timer();
t.Interval = 2000;
timer1.Enabled = true;
timer1.Tick += new System.EventHandler(OnTimerEvent);
El código del controlador de eventos tiene el siguiente aspecto.
private void OnTimerEvent(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Aquí está la demostración: C # Timer Tutorial
Consulte la documentación en msdn: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx