2011-06-09 13 views
6

Tengo un problema al ejecutar un backgroundworker en un momento específico.¿Cómo iniciar un BackgroundWorker en un momento específico?

Mi código ejecuta el backgoundworker 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 de un clic de botón 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 me podría ayudar,

Gracias de antemano.

+0

utilizar un temporizador? No estoy seguro de entender su pregunta, ¿puede dar más detalles? – jimplode

+0

Sé usar temporizador pero quiero usar el fondo. ¿Hay alguna forma de utilizar el intervalo de tiempo en el fondo –

+2

¿Por qué usa CancelAsync en el método DoWork()? –

Respuesta

11

en tiempo de ejecución

clase Timer representa un control Timer y se utiliza para crear un contador de tiempo 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í es demostración: C# Timer Tutorial

Comprobar la documentación en MSDN: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

+1

su respuesta es buena pero no puedo para votar u porque tengo solo 10 reputaciones lo siento –

+0

No creo que System.Timers.Timer tenga un evento Tick. En su lugar use Elapsed. – Dbloom

1

No se pudo utilizar una Timer para iniciar su BackgroundWorker?

+0

sí, pero es largo, hay más de 20 trabajadores de fondo en él –

5

puede agregar un Timer estableciendo el intervalo con la frecuencia con la que desea que se ejecute el trabajador en segundo plano y en el evento de temporizadores transcurridos puede iniciar el trabajador en segundo plano.

querrá comprobar que el trabajador de segundo plano no está ocupado antes de intentar volver a iniciarlo. Si ocurre esta situación, puede considerar iniciar inmediatamente el 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 luego en segundo plano los trabajadores completaron el evento necesita restablecer el temporizador y volver a iniciarlo.

EDITAR

después de uno de sus comentarios a continuación parece que usted tiene muchas backgroundworkers, en cuyo caso el uso de uno de los otros enfoques, que introduce un retraso en los trabajadores de fondo del evento completado antes de iniciar el BackgroundWorker de nuevo es probablemente una mejor solución.

Puede insertar el retraso usando Thread.Sleep() como se ha sugerido o quizás podría crear un temporizador en la función y asignar un delegado al evento de temporizadores transcurrido que reinició el trabajador de fondo. Algo a lo largo de estas líneas (no probado):

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

La solución más fácil sería dejar dormir al hilo durante 5 segundos en el comienzo de backgroundWorker1_DoWork: Thead.Sleep(5000).

Como alternativa, puede configurar un temporizador en RunWorkerCompleted que caduque en 5 segundos y luego vuelva a iniciar el BackgroundWorker.

+0

su respuesta es buena, pero no puedo votar u porque tengo solo 10 reputaciones lo siento –

2

¿Es necesario que se ejecute exactamente cada cinco segundos o no más de cinco segundos? Si es esto último se podría llamar Sleep(5000) en el Thread.CurrentThread justo antes de su BackgroundWorker termina su método DoWork().

+0

su respuesta es buena pero no puedo votar u porque tengo solo 10 reputaciones lo siento –

+0

@G Basha - Gracias ... Creo que puedes votar con 15 de reputación, a menos que hayas usado todos tus votos del día. – Yuck

2

Si desea utilizar BW intente esto:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Thread.Sleep(5000);//wait for 5s then run it again 
    backgroundWorker1.RunWorkerAsync(); 
} 
+0

su respuesta es buena, pero no puedo votar u porque tengo solo 10 reputaciones lo siento –

+0

@G Basha - ahora usted puede votar +1 a la pregunta .... –

+0

es colgando mi aplicación lo que debería –

Cuestiones relacionadas