¿Las tareas se crean como hilos en segundo plano?

85

Me pregunto si la nueva clase Task en dot.net 4 está creando un hilo de fondo o de primer plano.

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

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

Steffen
fuente

Respuestas:

119

No debería ser difícil de verificar:

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

Y la respuesta es ...

ǝnɹʇ

Darin Dimitrov
fuente
Tengo un problema en el que todas mis tareas se ejecutan en el hilo de llamada. Pegué esa línea precisa de código arriba en mi proyecto e informa "falso". ¿Sabes por qué podría ser eso? Estoy usando .NET 4.0.
Trevor Elliott
8
De acuerdo con este hilo stackoverflow.com/questions/7889746/… no se le garantiza un hilo en segundo plano al iniciar una tarea, pero debería estarlo si usa TaskCreationOptions.LongRunning. Estoy usando esa opción y todavía no estoy creando un hilo de fondo. ¿Lo que da?
Trevor Elliott
¿se puede configurar para no hacerlo?
Royi Namir
2
Creo que el problema de Moozhe puede estar en el contexto de sincronización predeterminado. El comportamiento puede ser diferente dependiendo de si está en una aplicación WinForms, WPF, Web o de consola, ya que todas tienen diferentes formas predeterminadas de programar tareas simultáneas.
jpierson
5
Me encanta tu respuesta: "ǝnɹʇ". Muy divertido. Gracias.
teddy
12

Si está comenzando a Task<T>usar Task.Run(), entonces sí.

Si está usando asyncy await, entonces no. Extracto de aquí :

"Las palabras clave async y await no hacen que se creen subprocesos adicionales. Los métodos asincrónicos no requieren subprocesos múltiples porque un método asíncrono no se ejecuta en su propio subproceso. El método se ejecuta en el contexto de sincronización actual y usa el tiempo en el subproceso solo cuando el método está activo. Puede usar Task.Run para mover el trabajo vinculado a la CPU a un subproceso en segundo plano, pero un subproceso en segundo plano no ayuda con un proceso que solo espera que los resultados estén disponibles ".

Steztric
fuente
1
Dado que está utilizando Task.Run, estará en el hilo de fondo, pero si llega a la espera, entonces podría hacer algo especial para pausar el hilo y esperar los resultados. Vale la pena investigar.
Steztric
0

Las tareas son ejecutadas por subprocesos que provienen del grupo de subprocesos del sistema. Un hilo que proviene del grupo de hilos se ejecuta en segundo plano de forma predeterminada.

Rueda giratoria
fuente
-1

Si aún no está convencido de una tarea en segundo plano, intente acceder a un elemento de la GUI desde 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:

La operación entre subprocesos no es válida: se accede al control 'label1' desde un subproceso distinto del subproceso en el que se creó.

al igual que con los viejos hilos de fondo regulares.

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

La mejor manera de manejar esto ... es iniciar un hilo en segundo plano que hace el trabajo usando Task.Run , y esperar su resultado. Esto permitirá que la interfaz de usuario se sienta fluida a medida que se realiza el trabajo.

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

Roland
fuente
Su verificación solo confirma que la tarea se ejecuta en su propio hilo, no que el hilo sea un hilo en segundo plano. Un subproceso en segundo plano es un subproceso que, si aún se está ejecutando, no evitará que el programa finalice.
Sören Kuklau