2011-03-06 15 views
64

Me pregunto si la nueva clase Task en dot.net 4 está creando un fondo o un hilo de primer plano.¿Las tareas se crean como subprocesos de fondo?

Normalmente establecería "IsBackground" en un subproceso, pero no existe tal atributo en una tarea.

No he podido encontrar ninguna documentación de esta en MSDN :-(

Respuesta

94

no debe ser difícil de verificar:

class Program 
{ 
    static void Main() 
    { 
     Task 
      .Factory 
      .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground)) 
      .Wait(); 
    } 
} 

Y la respuesta es ...

ǝnɹʇ

+2

+1 No pensé en esto - buen enfoque :-) – Steffen

+0

Tengo un problema donde todas mis tareas se ejecutan en el hilo de llamada. Pegué esa línea precisa de código en mi proyecto e informa "falso". ¿Sabes por qué podría ser? Estoy usando .NET 4.0. –

+7

De acuerdo con este hilo http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread, no tiene garantizado un hilo de fondo al iniciar una tarea, pero debe hacerlo si utiliza TaskCreationOptions.LongRunning. Estoy usando esa opción y todavía no está creando un hilo de fondo. ¿Lo que da? –

3

Si se refiere a iniciar un Task<T> usando async y await palabras clave, entonces la respuesta es no. Extracto de here:

"Las palabras clave asincrónicas y en espera no provocan que se creen subprocesos adicionales. Los métodos asíncronos no requieren multithreading porque un método asíncrono no se ejecuta en su propio hilo. El método se ejecuta en el actual contexto de sincronización y utiliza el tiempo en el subproceso solo cuando el método está activo. Puede usar Task.Run para mover el trabajo vinculado a CPU a un subproceso en segundo plano, pero un subproceso en segundo plano no ayuda con un proceso que está esperando a que los resultados se vuelvan disponible."

+0

Task.Run (async() => {....}) ??? ¿Qué pasa con esto? He usado 'async' – deadManN

0

Las tareas se ejecutan mediante subprocesos que provienen del grupo de subprocesos del sistema. Un subproceso que proviene del grupo de subprocesos se ejecuta en segundo plano de forma predeterminada.

0

Si no está convencido aún de una tarea de fondo, sólo tratar de acceder a un elemento de interfaz gráfica de usuario desde el interior de una tarea como:

public async Task<int> ProcessStuff_Async() 
{ 
    while(true) 
    { 
     label1.Text = "processing next item"; 

para obtener la excepción de tiempo de ejecución:

Cross- operación de subproceso no válida: Control 'etiqueta1' accedido desde un subproceso que no sea el subproceso en el que se creó.

al igual que con los buenos viejos hilos de fondo regulares.

Hay información en MSDN docs (a partir de 2017 :-), por ejemplo:

La mejor manera de manejar esto ... es comenzar un hilo fondo cuales hace el trabajo usando de tareas .Run y aguardan su resultado. Esto permitirá que la interfaz de usuario se sienta suave mientras se realiza el trabajo.

Este doc incluso tiene una sección What happens under the covers.

Cuestiones relacionadas