2010-07-18 20 views
7

Tengo una tarea ejecutándose en backgroundworker. al hacer clic en el botón de inicio, el usuario inicia el proceso y tiene un botón de cancelación para cancelar el procesamiento.C# background worker

Cuando el usuario hace clic en cancelar, me gustaría mostrar un mensaje que dice "El proceso no se ha completado, ¿desea continuar?".

Aquí quiero que el procesamiento quede solo después de la entrada del usuario. Hasta entonces, quiere detener el hilo de fondo. Puede alguien ayudarme con esto. ¿Hay alguna forma de detener al trabajador de segundo plano por algún tiempo? Cualquier tipo de ayuda será apreciada.

Respuesta

5

No incorporado. Podría decir su código (en cada [n] iteración de bucle, etc.) verifique algo como ManualResetEvent para ver si debería seguir funcionando (al mismo tiempo, comprueba si se cancela). No recomiendo suspender el hilo (Thread.Suspend), ya que no sabe qué cerraduras, etc. puede contener en ese momento.

Por otro lado ... ¿por qué no dejarlo funcionar hasta que sepa se debe cancelar? Entonces solo necesita verificar la cancelación (hay una bandera para esto) cada [n] iteraciones ...

+0

Tal vez el procesamiento requiera una gran cantidad de CPU y el programador quiera devolver recursos temporalmente al usuario mientras toma una decisión. –

+0

O el proceso de fondo está haciendo algo irreversible (eliminar archivos, etc.), que se debe interrumpir * rápidamente * si se inicia accidentalmente. – Heinzi

2

Si el BackgroundWorker está trabajando en un objeto que es visible para ambos hilos, podría "bloquear" ese objeto mientras espera que el usuario responda la pregunta en un cuadro de diálogo. Esto hará que el hilo del trabajador se detenga hasta que el hilo generador de diálogo finalice el bloqueo.

+0

Eso solo bloquearía al trabajador si el hilo del trabajador continuamente intenta adquirir el bloqueo y lo libera. Y podría llevar a ** ** UI ** a bloquearse si el * work * * no * lo liberara cada vez. –

+0

Correcto, dependerá de la forma en que el trabajador use el objeto (cuando/si se adquiere/libera el bloqueo). Pero un nuevo objeto compartido 'ficticio' podría usarse si no se trata ningún objeto existente según las condiciones indicadas anteriormente (en publicaciones y comentarios). – Assaf