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
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.
No puede volver a iniciar una existente Task
. Entonces usted tiene dos opciones:
- Comience una nueva
Task
. Esto es probablemente más limpio. - Ejecute un ciclo en su
Task
que comprueba si algo cambió desde la última vez y, si lo hace, comienza una nueva iteración.
La misma pregunta que arriba: ¿Cómo señalarías la necesidad de la segunda tarea? – SonOfPirate
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
También podría refactorizar la lógica del programa para usar punteros a funciones (o delegados en VB.NET).
- 1. lógica evento recurrente
- 2. Paypal pago recurrente
- 3. Cantidad variable facturación recurrente
- 4. Curiosamente recurrente plantilla - variación
- 5. Eclipse recurrente colgando
- 6. Cómo conjunto recurrente AlarmManager ejecutar código diaria
- 7. Cómo programar una tarea Maven
- 8. PHP. ¿Cómo obtener un evento bimensual recurrente?
- 9. Paypal, facturación recurrente y ActiveMerchant
- 10. Evento recurrente de Jquery Fullcalender
- 11. recurrente perfil y lote sería
- 12. ¿Suscripción de PayPal contra recurrente?
- 13. Aplicar macro recurrente en Clojure
- 14. Conversión a bucle ... recurrencia recurrente
- 15. "PermGen" recurrente en Tomcat 6
- 16. Cómo forzar una excepción de una tarea para ser observada en una tarea de continuación?
- 17. Cómo crear una tarea en primer plano?
- 18. Cómo programar una tarea mediante programación
- 19. ¿Cómo forzar la cancelación de una tarea?
- 20. ¿Cómo programar una tarea periódica en Java?
- 21. ¿Cómo poner una tarea (sfBaseTask) en unitest?
- 22. ¿Cómo reprogramar una tarea usando un ScheduledExecutorService?
- 23. ¿Cómo puedo retrasar una tarea usando Apio?
- 24. ¿Cómo ejecutar una tarea diariamente desde Java?
- 25. Cómo programar una tarea en segundo plano
- 26. ContinueWith una tarea cancelada
- 27. Cancelar una tarea
- 28. ¿Qué devuelve una tarea?
- 29. ¿Cómo declaras una tarea de Rake que depende de una tarea parametrizada?
- 30. Excepción recurrente sin un seguimiento de pila: ¿cómo restablecerlo?
¿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
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. –
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