2012-07-03 22 views
5

Estoy usando System.ComponentModel.BackgroundWorker en mi WPF aplicación.Tiempo de espera para BackgroundWorker

¿Cómo puedo establecer tiempo de espera para BackgroundWorker?

+1

tiempo de espera para hacer qué? – Dimitri

+1

algo, hace algo, y quiero dejar de hacerlo después de tiempo de espera. –

+0

Sí, como BugFinder dijo usar token de cancelación para cancelar la ejecución – Dimitri

Respuesta

4

Mi sugerencia está siguiendo

backgroundworker1 hace el trabajo - se acepta la cancelación por lo que puede hacer que se detenga.

backgroundworker2 realiza un ciclo mientras el tiempo de espera está pendiente y finaliza el tiempo de espera.

Si backgroundworker1 sigue funcionando, el RunWorkerComplete de esta BackgroundWorker, mata a backgroundworker1 ..

Esto también debe aceptar cancelación de modo que si backgroundworker1 ultima y esto todavía se está ejecutando , puedes cancelarlo

+0

otro hilo de facto, ¿no es fácil, de otra manera? –

+0

Probablemente, para obtener un tiempo de espera bastante preciso, así como la funcionalidad, no hay muchas opciones. Podría hacer algún tipo de descendiente y verificar constantemente el tiempo transcurrido en su trabajador original, pero, si tuviera alguna forma de llamada de bloqueo, podría exceder el tiempo de espera. – BugFinder

4

BackgroundWorker no admite directamente el tiempo de espera, pero admite la cancelación. Esto funcionará bien si el trabajo que se realiza es un bucle u otra estructura donde puede verificar periódicamente el miembro CancellationPending para luego abortar. Necesitará algo más para decirle al trabajador de fondo que cancele después del tiempo de espera. Aquí usé una llamada asíncrona de una acción.

static void Main(string[] args) 
    { 
     var bg = new BackgroundWorker { WorkerSupportsCancellation = true }; 
     bg.DoWork += LongRunningTask; 

     const int Timeout = 500; 
     Action a =() => 
      { 
       Thread.Sleep(Timeout); 
       bg.CancelAsync(); 
      }; 
     a.BeginInvoke(delegate { }, null); 

     bg.RunWorkerAsync(); 

     Console.ReadKey(); 
    } 

    private static void LongRunningTask(object sender, DoWorkEventArgs eventArgs) 
    { 
     var worker = (BackgroundWorker)sender; 
     foreach (var i in Enumerable.Range(0, 5000)) 
     { 
      if (worker.CancellationPending) 
      { 
       return; 
      } 
      else 
      { 
       //Keep working 
      } 
     } 
    } 

Si esto no se ajusta realmente lo que su están tratando de lograr que pueda estar interesado en las soluciones de tiempo de espera genéricos encontrados en Implementing a timeout on a function returning a value o Implement C# Generic Timeout. Puedes usarlos dentro del BackgroundWorker.

+0

Gracias pero no funciona, eventArgs.Cancel nunca se hace realidad. –

+0

@ArmenKhachatryan Oh, por supuesto que no, estaba revisando el objeto incorrecto para cancelar la información (^ _ ^;). He editado con una corrección. – vossad01

+0

Funciona como un encanto. Muchas gracias ... Si va al modo OO ;-), Your can Global var bg = new BackgroundWorker y usa CancelAsync(); en cualquier parte de tu código. –

Cuestiones relacionadas