2011-04-11 34 views

Respuesta

57

¿Qué es diffrence entre una tarea y un hilo?

Supongamos que está ejecutando una empresa de entrega de libros. Tienes cuatro autos y cuatro conductores. Un automóvil es un hilo, un conductor es un procesador y una entrega de libros es una tarea. El problema que enfrenta es cómo programar de forma eficiente los controladores y los autos para que las tareas se realicen lo más rápido posible.

Donde las cosas se ponen raras es cuando hay más autos (hilos) que conductores (procesadores). Luego, a mitad de un viaje, el conductor estaciona un auto (suspende el hilo) y se mete en un automóvil diferente (cambia de contexto), lo conduce por un rato y luego regresa al primer automóvil. Obviamente, eso no es tan eficiente como que un conductor se quede en un auto.

La idea de parallism basado en tareas es dividir el trabajo en pequeños tareas que puede producir resultados en el futuro, y luego asignar eficientemente exactamente como muchos hilos, ya que hay procesadores de tal modo que no lo hace perder el cambio de contexto de tiempo. En la práctica, generalmente no funciona muy bien, pero esa es la idea.

cuál es mejor, tarea o hilo?

La pregunta no puede responderse porque no tiene ningún sentido. ¿Qué es mejor, un libro para entregar a un cliente o un automóvil para entregarlo? Un automóvil es un dispositivo que se puede usar para entregar un libro; esas dos cosas no son cosas que puedes describir sensatamente como "mejores" o "peores" que las otras. Es como preguntar "¿qué es mejor, un agujero o un taladro?"

+0

Gracias por la aclaración – santosh

+4

'¿cuál es mejor, tarea o hilo?' Creo que OP significaba usar la clase 'Thread' en lugar de usar' Task 'y no el hilo en sí. – Aliostad

+6

gran analogía. No he visto esto explicado tan claramente antes de –

6

Estas son algunas diferencias:

  • Task por defecto utiliza la piscina hilo mientras directamente utilizando Thread requerirá la creación de nuevos hilo.
  • Task manejará las excepciones y los resultados por lo que es más fácil usarlo.
  • Task puede admitir la cancelación al usar hilos, tiene que implementarlo usted mismo.
+0

La tarea no utiliza necesariamente el ThreadPool. Este es el valor predeterminado (en .NET 4), pero no siempre es verdadero. –

+1

@Reed Gracias. ¿Cuáles son las excepciones? ¿Cómo puede ser anulado? ¿Te importaría señalarme una referencia por favor? – Aliostad

+2

Depende de TaskScheduler decidir dónde y cómo ejecutar una tarea. El schduler predeterminado usa el ThreadPool (a menos que se establezca la sugerencia LongRunning, en cuyo caso la tarea obtiene un hilo dedicado), pero un planificador puede hacer lo que quiera. Además, las continuaciones a menudo se ejecutan con un planificador basado en el SynchronizationContext actual. He escrito sobre la programación aquí: http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/ –

17

una "tarea" es una pieza de trabajo que se ejecutará, y completa en algún momento en el futuro.

Un "hilo" es cómo se ejecuta algo.

Normalmente, cuando se crea una tarea, por defecto (es decir: el uso de Task.Factory.StartNew), el Task conseguirá Programado para ejecutarse a partir de un hilo ThreadPool en algún momento. Sin embargo, esto no siempre es verdad.

La ventaja de hacer esta separación es que usted está permitiendo que el marco (o usted mismo, si se utiliza una costumbre TaskScheduler) para controlar cómo su trabajo se proyecta sobre temas disponibles. Normalmente, tendrá muchos más elementos de trabajo que hilos: puede tener un millón de elementos para procesar, pero solo 8 núcleos en su sistema. En una situación como esta, es mucho más eficiente utilizar un número fijo de subprocesos y hacer que cada subproceso procese varios elementos de trabajo. Al separar "Tarea" de "Subproceso", está rompiendo este acoplamiento de trabajo == subproceso.

En general, recomendaría usar Task en lugar de crear sus propios hilos. Este es un modelo mucho más agradable, más potente y flexible para usar en el desarrollo, especialmente porque le permite manejar excepciones de una manera muy limpia, permite que se generen cosas agradables, como continuaciones, etc.

4

Según MSDN reference documentation :

la tarea paralela Biblioteca (TPL) es un conjunto de tipos de públicos y APIs en los espacios de nombres System.Threading y System.Threading.Tasks en la versión de .NET Framework 4. el propósito de la TPL es hacer los desarrolladores son más productivos al simplificar el proceso de agregar paralelismo y concurrencia a las aplicaciones. El TPL escala el grado de concurrencia de forma dinámica para utilizar de manera más eficiente todos los procesadores disponibles. Además, el TPL maneja la partición del trabajo, la programación de hilos en el ThreadPool, el soporte de cancelación, la administración del estado y otros detalles de bajo nivel. Al usar TPL, puede maximizar el rendimiento de su código mientras se enfoca en el trabajo que su programa está diseñado para lograr.

lo que parece que es un Task el medio preferido de codificación de una operación asíncrona, ya que gran parte del trabajo es atendido por el marco. Pero, por otro lado, Thread todavía está disponible para el código existente y para los casos en los que explícitamente desea asignar y administrar una secuencia del sistema operativo.

5

A Tarea significa una acción o trabajo que desea hacer.

A El hilo puede ser uno de los ejecutores o trabajadores que realizan ese trabajo.

Cuestiones relacionadas