As tarefas são criadas como threads de fundo?

85

Só estou me perguntando se a nova classe Task no dot.net 4 está criando um segmento de plano de fundo ou primeiro plano?

Normalmente, eu definiria "IsBackground" em um Thread, mas não existe tal atributo em uma Tarefa.

Não consegui encontrar nenhuma documentação sobre isso no MSDN :-(

Steffen
fonte

Respostas:

119

Não deve ser difícil de verificar:

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

E a resposta é ...

ǝnɹʇ

Darin Dimitrov
fonte
Estou tendo um problema em que todas as minhas tarefas estão em execução no thread de chamada. Colei essa linha precisa de código acima em meu projeto e ela relata "falso". Você sabe por que isso pode ser? Estou usando o .NET 4.0.
Trevor Elliott
8
De acordo com este thread stackoverflow.com/questions/7889746/… você não tem garantia de um thread em segundo plano ao iniciar uma tarefa, mas deveria ter se você usar TaskCreationOptions.LongRunning. Estou usando essa opção e ainda não estou criando um thread de segundo plano. O que da?
Trevor Elliott
pode ser configurado para não?
Royi Namir
2
Eu acredito que o problema do Moozhe pode ser com o contexto de sincronização padrão. O comportamento pode ser diferente dependendo se você está em um aplicativo WinForms, WPF, Web ou Console, uma vez que todos eles têm maneiras diferentes de agendar tarefas simultâneas.
jpierson
5
adorei sua resposta: "ǝnɹʇ". Muito engraçado. Obrigado.
ursinho de
12

Se você está começando a Task<T>usar Task.Run(), sim.

Se você estiver usando asynce await, não. Trecho daqui :

"As palavras-chave async e await não causam a criação de threads adicionais. Os métodos assíncronos não exigem multithreading porque um método assíncrono não é executado em seu próprio thread. O método é executado no contexto de sincronização atual e usa o tempo no thread apenas quando o método está ativo. Você pode usar Task.Run para mover o trabalho vinculado à CPU para um thread em segundo plano, mas um thread em segundo plano não ajuda com um processo que está apenas esperando os resultados ficarem disponíveis. "

Steztric
fonte
1
Como você está usando Task.Run, ele estará no thread de segundo plano, mas se atingir um await, ele pode fazer algo especial para pausar o thread e aguardar os resultados. Vale a pena investigar.
Steztric
0

As tarefas são executadas por threads que vêm do pool de threads do sistema. Um thread que vem do pool de threads é executado em segundo plano por padrão.

Roda giratória
fonte
-1

Se você ainda não está convencido de uma tarefa em segundo plano, tente acessar um elemento da GUI de dentro de uma tarefa como:

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

para obter a exceção de tempo de execução:

A operação cross-thread não é válida: controle 'label1' acessado de um thread diferente do thread em que foi criado.

assim como os bons e velhos tópicos regulares de fundo.

Há informações nos documentos do MSDN (em 2017 :-), por exemplo:

A melhor maneira de lidar com isso ... é iniciar um thread em segundo plano que faz o trabalho usando Task.Run e aguardar seu resultado. Isso permitirá que a IU pareça suave enquanto o trabalho está sendo feito.

Este documento ainda tem uma seção What happens under the covers.

Roland
fonte
Sua verificação apenas confirma se a tarefa é executada em seu próprio encadeamento, não se o encadeamento é um encadeamento em segundo plano. Um thread em segundo plano é um thread que, se ainda estiver em execução, não impedirá que o programa seja encerrado.
Sören Kuklau de