2012-02-27 8 views
13

Tengo una tarea de larga duración que he implementado utilizando la Biblioteca de tareas paralelas. Cuando se inicia la Tarea, tomo instantáneas de varios valores de entrada y colecciones, luego realizo varias operaciones usando esa información. Si alguno de esos valores o colecciones cambian mientras la Tarea se está ejecutando, me gustaría que la Tarea se ejecute de nuevo inmediatamente después de la finalización. ¿Debo crear una nueva tarea o hay alguna forma de reutilizar la tarea existente? ¿Cuál es la mejor manera de comenzar la segunda iteración?¿Cómo reiniciar/reutilizar una tarea recurrente?

Respuesta

11

Crea una nueva tarea.

Como http://msdn.microsoft.com/en-us/library/dd270682.aspx señala, no se admite el intento de reiniciar una tarea en ejecución o completada. Raramente es una buena idea hacer algo que normalmente arroja una excepción, y volver a usar una Tarea es una de esas cosas.

+0

¿Cómo señalaría la necesidad de la segunda tarea? Los cambios pueden ocurrir mientras la tarea original se está ejecutando o no hasta algún momento después de que se haya completado. – SonOfPirate

+0

Basado en ese criterio, creo que le iría bien con una Tarea única y sin terminación que sondea el estado actual, y si el estado cambia, haga lo suyo. El requisito básico aquí es que esto ocurra de forma asíncrona, para evitar el bloqueo del hilo principal. Debería colocar una bandera de algún tipo para indicar a la Tarea que la aplicación se está cerrando y que debe terminar. –

+0

Una tarea única, sin terminación es lo que estaba pensando. Puedo utilizar un CancellationToken para manejar cuándo se cierra la aplicación, pero no estoy seguro de qué mecanismo debo usar para marcar que necesito la tarea para ejecutar mis algoritmos. Si utilizo un AutoResetEvent, no podré cancelar porque el hilo de la Tarea se suspenderá esperando el evento. Por otro lado, estoy leyendo que usar SpinWait consume mucha CPU. – SonOfPirate

1

No puede volver a iniciar una existente Task. Entonces usted tiene dos opciones:

  1. Comience una nueva Task. Esto es probablemente más limpio.
  2. Ejecute un ciclo en su Task que comprueba si algo cambió desde la última vez y, si lo hace, comienza una nueva iteración.
+0

La misma pregunta que arriba: ¿Cómo señalarías la necesidad de la segunda tarea? – SonOfPirate

+0

Difícil de decir sin saber cómo se determina que la segunda tarea es necesaria. Si desea reiniciar incluso después de que se haya completado, puede usar eventos. – svick

0

También podría refactorizar la lógica del programa para usar punteros a funciones (o delegados en VB.NET).

Cuestiones relacionadas