Pregunta

Recientemente intenté usar backgroundworker en lugar de " clásico " Hilos y me estoy dando cuenta de que está causando, al menos para mí, más problemas que soluciones. Tengo un trabajador en segundo plano que ejecuta una lectura síncrona (en este caso de serialPort) y me bloquea alrededor de 30 segundos en una línea de código, luego la cancelación no es la solución. Estoy viendo que si la aplicación se cierra en este punto (ya sea con el botón en cruz y con Application.Exit ()), el proceso mantendrá al zombi para siempre.

Necesito una forma de forzar el aborto o matar el subproceso de backgroundworker.

¿Fue útil?

Solución

No estoy muy seguro de lo que está tratando de lograr, pero tal vez el ¿El evento SerialPort.DataReceived es una mejor solución?

Si ya eres experto en el uso de hilos, no veo el punto de usar BackgroundWorker. Está diseñado para personas que no entienden los hilos en primer lugar.

Además, no me gusta la idea de abortar un hilo. Se siente peligroso, y las aplicaciones multiproceso no necesitan más riesgos.

Otros consejos

Puse una junta que (creo) hace el trabajo. Por favor, hágamelo saber si estoy waaaay apagado. Aquí hay un ejemplo simple de cómo funciona.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

Como el trabajador de fondo forma parte del grupo de subprocesos, no queremos abortarlo. Pero podemos ejecutar un hilo internamente en el que podemos permitir que se produzca un aborto. El backgroundWorker se ejecuta básicamente hasta que se completa el subproceso secundario o le indicamos que elimine el proceso. El subproceso de trabajo en segundo plano puede volver al grupo de lectura. Por lo general, lo envolveré en una clase auxiliar y pasaré por el método de delegado que quiero que el subproceso de fondo se ejecute como parámetro y lo ejecutaré en el subproceso secundario.

Por favor, alguien avíseme si estoy golpeando mi cabeza contra una pared pero parece funcionar bien ... Pero ese es el problema con los hilos no es ... los resultados variables que puede obtener cuando lo ejecuta en diferentes momentos.

El proceso no debe convertirse en un zombie, ya que el subproceso de BackgroundWorker está marcado como " background " y debería finalizar cuando la IU esté cerrada.

No creo que BackgroundWorker admita la eliminación del subproceso. La cancelación de una operación debe realizarse en el método que realiza el trabajo. En su caso, creo que un hilo regular será la mejor opción.

Puedes probar esto:

            backgroundworker.Dispose();
            backgroundworker = null;
            GC.Collect(); //this helps cleans up ram
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top