2011-06-07 14 views
6

que tiene un trabajador de fondo que hace básicamente lo siguiente:C Trabajador # Antecedentes Pregunta

  1. Buscar siguiente archivo disponible y marcarlo como en el proceso de
  2. procesar el archivo y guardar la versión actualizada como un nuevo archivo
  3. Marque la original como procesado

los pasos anteriores se necesitan bucle y continuar el proceso, mientras que hay archivos para procesar.

Me gustaría que se detenga el Trabajador de fondo, y veo la configuración WorkerSupportsCancellation, pero ¿cómo me aseguro de que solo puede detenerse entre los archivos, no mientras se procesa un archivo?

Respuesta

7

Establezca WorkerSupportsCancellation en verdadero y compruebe periódicamente la propiedad CancellationPending en el controlador de eventos DoWork.

El método CancelAsync solo establece la propiedad CancellationPending. No mata el hilo; Depende del trabajador responder a la solicitud de cancelación.

ej .:

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    while(!myBackgroundWorker.CancellationPending) 
    { 
     // Process another file 
    } 
} 
+0

grande, gracias! Aceptaré tu respuesta cuando me lo permita. –

+1

Querrá ver la respuesta a continuación, ya que es más completa. – bdwakefield

5

Usted tiene que comprobar CancellationPending procepty del trabajador de fondo al final del procesamiento de archivos

static void Main(string[] args) 
      { 
       BackgroundWorker bw = new BackgroundWorker(); 
       bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
       bw.WorkerSupportsCancellation = true; 
       bw.RunWorkerAsync(); 
       Thread.Sleep(5000); 
       bw.CancelAsync(); 
       Console.ReadLine(); 
      } 

      static void bw_DoWork(object sender, DoWorkEventArgs e) 
      { 
       string[] files = new string[] {"", "" }; 
       foreach (string file in files) 
       { 
        if(((BackgroundWorker)sender).CancellationPending) 
        { 
         e.Cancel = true; 
         //set this code at the end of file processing 
         return; 
        } 
       } 
      }