En C # 4.0, tenemos Task
en el espacio de nombres System.Threading.Tasks . ¿Cuál es la verdadera diferencia entre Thread
y Task
. Hice algún programa de muestra (ayuda tomada de MSDN) por mi propio bien de aprender con
Parallel.Invoke
Parallel.For
Parallel.ForEach
pero tengo muchas dudas ya que la idea no es tan clara.
Inicialmente busqué en Stackoverflow un tipo similar de pregunta, pero es posible que con este título de pregunta no haya podido obtener la misma. Si alguien sabe sobre el mismo tipo de pregunta que se está publicando aquí anteriormente, amablemente proporcione la referencia del enlace.
c#
multithreading
c#-4.0
task-parallel-library
terminology
hippietrail
fuente
fuente
Respuestas:
Una tarea es algo que quieres hacer.
Un hilo es uno de los muchos posibles trabajadores que realiza esa tarea.
En términos de .NET 4.0, una tarea representa una operación asincrónica. Los subprocesos se utilizan para completar esa operación dividiendo el trabajo en trozos y asignándolos a subprocesos separados.
fuente
En términos informáticos, a
Task
es un futuro o una promesa . (Algunas personas usan esos dos términos de manera sinónimo, algunos los usan de manera diferente, nadie puede ponerse de acuerdo en una definición precisa ). Básicamente, unaTask<T>
"promesa" de devolverle unT
, pero no ahora, cariño, estoy un poco ocupado, ¿por qué no? vuelves mas tarde?A
Thread
es una forma de cumplir esa promesa. Pero no todosTask
necesitan un nuevoThread
. (De hecho, la creación de un subproceso a menudo no es deseable, porque hacerlo es mucho más costoso que reutilizar un subproceso existente del conjunto de subprocesos. Más sobre eso en un momento). Si el valor que está esperando proviene del sistema de archivos o un base de datos o la red, entonces no hay necesidad de un subproceso para sentarse y esperar los datos cuando pueden atender otras solicitudes. En cambio,Task
podrían registrar una devolución de llamada para recibir los valores cuando estén listos.En particular, el
Task
qué no dicen qué es lo que se necesita mucho tiempo para devolver el valor. Se podría ser que se necesita mucho tiempo para calcular, o puede que se necesita mucho tiempo para buscarlo. Solo en el primer caso usarías aThread
para ejecutar aTask
. (En .NET, los subprocesos son extremadamente caros, por lo que generalmente desea evitarlos tanto como sea posible y realmente solo los usa si desea ejecutar múltiples cálculos pesados en múltiples CPU. Por ejemplo, en Windows, un subproceso pesa 12 KiByte ( Creo que), en Linux, un hilo pesa tan solo 4 KiByte, en Erlang / BEAM incluso solo 400 Byte. ¡En .NET, es 1 MiByte!)fuente
Task
.Hilo
Lo más básico, probablemente no necesite usarlo, probablemente pueda usar una
LongRunning
tarea y aprovechar los beneficios de TPL - Task Parallel Library, incluida en .NET Framework 4 (febrero de 2002) y superior (también .NET Núcleo).Tareas
Abstracción sobre los hilos. Se utiliza el grupo de subprocesos (a menos que especifique la tarea como una
LongRunning
operación, si es así, un nuevo hilo se crea bajo el capó para usted).Grupo de hilos
Como su nombre indica: un grupo de hilos. ¿El framework .NET maneja un número limitado de hilos por usted? ¿Por qué? Porque abrir 100 hilos para ejecutar costosas operaciones de CPU en un procesador con solo 8 núcleos definitivamente no es una buena idea. El marco mantendrá este grupo para usted, reutilizando los hilos (sin crearlos / eliminándolos en cada operación) y ejecutando algunos de ellos en paralelo, de manera que su CPU no se queme.
OK, pero ¿cuándo usar cada uno?
En resumen: siempre use tareas.
La tarea es una abstracción, por lo que es mucho más fácil de usar. Le aconsejo que siempre intente usar tareas y si enfrenta algún problema que le obligue a manejar un hilo usted mismo (probablemente el 1% del tiempo), use hilos.
PERO ten en cuenta que:
LongRunning
tareas ( o subprocesos si es necesario ). Porque el uso de tareas lo llevaría a un grupo de subprocesos con algunos subprocesos ocupados y muchas otras tareas esperando su turno para tomar el grupo.fuente
Puede usar
Task
para especificar lo que desea hacer y luego adjuntarloTask
con unThread
. para queTask
se ejecute en ese recién hecho enThread
lugar de en el hilo GUI.Usar
Task
con elTaskFactory.StartNew(Action action)
. Aquí ejecuta un delegado, por lo que si no usó ningún hilo, se ejecutaría en el mismo hilo (hilo GUI). Si menciona un hilo, puede ejecutarloTask
en un hilo diferente. Este es un trabajo innecesario porque puede ejecutar directamente el delegado o adjuntar ese delegado a un hilo y ejecutar ese delegado en ese hilo. Así que no lo uses. Es simplemente innecesario. Si tiene la intención de optimizar su software, este es un buen candidato para ser eliminado.** Tenga en cuenta que el
Action
es undelegate
.fuente
Además de los puntos anteriores, sería bueno saber que:
fuente
Usualmente uso
Task
para interactuar con Winforms y un simple trabajador de fondo para que no congele la interfaz de usuario. Aquí un ejemplo cuando prefiero usarTask
VS
la diferencia es que no necesitas usar un
MethodInvoker
código más corto.fuente
La tarea es como una operación que desea realizar, Thread ayuda a administrar esas operaciones a través de múltiples nodos de proceso. La tarea es una opción ligera, ya que Threading puede conducir a una gestión de código compleja
. Sugeriré que lea desde MSDN (Mejor en el mundo) siempre
Tarea
Hilo
fuente
Una tarea se puede ver como una manera conveniente y fácil de ejecutar algo de forma asincrónica y paralela.
Normalmente, una tarea es todo lo que necesita, no recuerdo si alguna vez he usado un hilo para algo más que la experimentación.
Puede lograr lo mismo con un hilo (con mucho esfuerzo) como puede hacerlo con una tarea.
Hilo
Tarea
Por defecto, una tarea utilizará Threadpool, lo que ahorra recursos, ya que crear subprocesos puede ser costoso. Puede ver una Tarea como una abstracción de nivel superior en subprocesos.
Como señala este artículo , la tarea proporciona las siguientes características potentes a través de hilo.
Las tareas están ajustadas para aprovechar los procesadores multinúcleo.
Si el sistema tiene varias tareas, utiliza internamente el grupo de subprocesos CLR y, por lo tanto, no tiene la sobrecarga asociada con la creación de un subproceso dedicado mediante el subproceso. También reduzca el tiempo de cambio de contexto entre múltiples hilos.
Espere en un conjunto de tareas, sin una construcción de señalización.
Podemos encadenar tareas para ejecutar una tras otra.
Establezca una relación padre / hijo cuando una tarea se inicia desde otra tarea.
La excepción de tarea secundaria puede propagarse a la tarea principal.
Cancelación de soporte de tareas mediante el uso de tokens de cancelación.
La implementación asincrónica es fácil en la tarea, utilizando palabras clave 'async' y 'wait'.
fuente