2012-01-30 14 views
10

Estoy investigando el uso de la Task Parallel Library para un proyecto de trabajo que estoy haciendo y quiero entender las ventajas/desventajas de las tareas de ejecución prolongada. Todavía no tengo un ejemplo de la vida real, solo quiero entender la teoría detrás de esto.Task Parallel Library - Tarea LongRunning vs Multiple Continuations

Según lo que dicen las páginas de MSDN sobre task schedulers y este SO question, parecería que es mejor evitar las tareas de larga ejecución tanto como sea posible para que no se creen subprocesos fuera de ThreadPool. Pero digamos que tenía una tarea que se va a tardar mucho tiempo en completarse, en lugar de esto:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

Podría tratar de dividir el trabajo en partes más pequeñas, las unidades más rápidas de trabajo y utilizar continuaciones de tareas, como esto:

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

¿Este enfoque sería más beneficioso o es excesivo para lo que está tratando de lograr?

+0

Realmente depende de lo que quieres decir con * long *. –

Respuesta

5

parecería como si lo mejor es evitar tareas de larga duración tanto como sea posible

No es del todo correcto. Si lo necesita, tendrá que hacer/asignar un hilo de alguna manera y luego la opción Tarea con ejecución prolongada es probablemente la mejor opción. La bandera simplemente informa al planificador que la Tarea puede tardar un tiempo para que el planificador pueda anticipar. Incluso podría ignorar la opción.

Podría tratar de dividir su trabajo en unidades más pequeñas, más rápidas de trabajo a la

Si es posible, y luego hacerlo. Pero no todos los taks se separan tan fácilmente.

+0

Estoy de acuerdo en que no todos los algoritmos se pueden dividir fácilmente en trozos más pequeños. Pero si pudieras, ¿sería mejor hacerlo? Supongo que utilizaría el TPL mejor que el planificador creando otro hilo, ¿estoy en lo correcto? –

+0

Podría ser mejor, pero eso no es seguro. Por lo general, no me molestaría demasiado. Usted no (no puede) saber si conduce a un hilo adicional. –

3

Cuando especifica TaskCreationOptions.LongRunning en su mayoría, asigna un hilo dedicado desde fuera del grupo de subprocesos.

Yo sugeriría simplemente ir a clase BackgroundWorker lo que hace que su tarea de larga ejecución se corrió en un hilo dedicado independiente en lugar de un hilo de grupo de subprocesos

+1

TaskCreationOptions.LongRunning también suele provocar la creación de un subproceso dedicado. – dtb

Cuestiones relacionadas