Creando hilos – Task.Factory.StartNew vs new Thread ()

Solo estoy aprendiendo sobre las nuevas bibliotecas Threading y Parallel en .Net 4

En el pasado, creaba un hilo nuevo como ese (como ejemplo):

DataInThread = new Thread(new ThreadStart(ThreadProcedure)); DataInThread.IsBackground = true; DataInThread.Start(); 

Ahora puedo hacer:

 Task t = Task.Factory.StartNew(() => { ThreadProcedure(); }); 

¿Cuál es la diferencia si alguno?

Gracias

Existe una gran diferencia. Las tareas están progtwigdas en ThreadPool e incluso se pueden ejecutar sincrónicamente si corresponde.

Si tiene un fondo de larga ejecución, debe especificarlo utilizando la opción Tarea correcta.

Debería preferir la Biblioteca de tareas paralelas en lugar del manejo de hilos explícito, ya que está más optimizado. También tienes más funciones como Continuación.

La tarea te da toda la bondad de la tarea API:

  • Agregar continuaciones ( Task.ContinueWith )
  • Esperando a que se completen varias tareas (ya sea todas o todas)
  • Capturar errores en la tarea e interrogarlos más tarde
  • Capturar la cancelación (y permitirle especificar la cancelación para comenzar)
  • Potencialmente teniendo un valor de retorno
  • Usando await en C # 5
  • Mejor control sobre la progtwigción (si va a ser de larga duración, indíquelo cuando crea la tarea para que el planificador de tareas pueda tener eso en cuenta)

Tenga en cuenta que en ambos casos puede hacer que su código sea un poco más simple con las conversiones de grupos de métodos:

 DataInThread = new Thread(ThreadProcedure); // Or... Task t = Task.Factory.StartNew(ThreadProcedure); 

En el primer caso, simplemente está comenzando un nuevo hilo mientras que en el segundo caso está ingresando en el grupo de hilos.

El trabajo del grupo de subprocesos es compartir y reciclar subprocesos. Permite evitar perder unos milisegundos cada vez que necesitamos crear un nuevo hilo.

Hay varias formas de ingresar al grupo de subprocesos:

  • con el TPL (Task Parallel Library) como lo hizo
  • llamando a ThreadPool.QueueUserWorkItem
  • llamando a BeginInvoke a un delegado
  • cuando usas un BackgroundWorker

Su primer bloque de código le dice a CLR que cree un Thread (por ejemplo, T) para usted, que se puede ejecutar como fondo (use hilos del grupo de hilos al progtwigr T). En resumen, pides explícitamente a CLR que cree un hilo para que hagas algo y llamas al método Start () en el hilo para comenzar.

Su segundo bloque de código hace lo mismo pero delega (implícitamente entrega) la responsabilidad de crear el hilo (fondo, que nuevamente se ejecuta en el grupo de subprocesos) y el hilo de inicio a través del método StartNew en la implementación de Task Factory.

Esta es una diferencia rápida entre bloques de código dados. Habiendo dicho eso, hay algunas diferencias detalladas que puedes buscar en Google o ver otras respuestas de mis compañeros colaboradores.