c# trabalhando Qual é a diferença entre tarefa e thread?




trabalhando com task c# (6)

Eu costumo usar a Task para interagir com o WinForms e com o simples trabalhador em segundo plano para que ele não congele a interface do usuário. aqui um exemplo quando eu prefiro usar o Task

private async void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    await Task.Run(() => {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
    })
    buttonDownload.Enabled = true;
}

VS

private void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    Thread t = new Thread(() =>
    {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
        this.Invoke((MethodInvoker)delegate()
        {
            buttonDownload.Enabled = true;
        });
    });
    t.IsBackground = true;
    t.Start();
}

a diferença é que você não precisa usar o MethodInvoker e um código mais curto.

No c # 4.0, temos Task no namespace System.Threading.Tasks . Qual é a verdadeira diferença entre Thread e Task ? Eu fiz um programa de exemplo (ajuda tirada do MSDN) para meu próprio aprendizado com

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

mas tenho muitas dúvidas pois a ideia não é tão clara.

Eu procurei inicialmente em Stackoverflow por um tipo semelhante de pergunta, mas pode ser com este título de pergunta que eu não fui capaz de obter o mesmo. Se alguém souber sobre o mesmo tipo de pergunta que está sendo postado aqui anteriormente, gentilmente forneça a referência do link.


Uma tarefa é algo que você quer fazer.

Um thread é um dos muitos trabalhadores possíveis que executa essa tarefa.

Em termos do .NET 4.0, uma Task representa uma operação assíncrona. Thread (s) são usados ​​para concluir essa operação, dividindo o trabalho em partes e atribuindo a segmentos separados.


Tarefa é como uma operação que você quer executar, Thread ajuda a gerenciar essas operações através de múltiplos nós de processos. tarefa é uma opção leve, pois o Threading pode levar a um gerenciamento de código complexo
Eu sugiro ler do MSDN (Best in world) sempre

Task

Thread


Em termos de ciência da computação, uma Task é um futuro ou uma promessa . (Algumas pessoas usam esses dois termos sinonimamente, alguns usam de forma diferente, ninguém pode concordar com uma definição precisa .) Basicamente, uma Task<T> "promete" te devolver um T , mas não agora, querida, estou meio ocupado Por que você não volta mais tarde?

Um Thread é uma maneira de cumprir essa promessa. Mas nem toda Task precisa de um Thread novinho em Thread . (Na verdade, criar um encadeamento geralmente é indesejável, porque isso é muito mais caro do que reutilizar um encadeamento existente do encadeamento de encadeamentos. Mais sobre isso em breve.) Se o valor que você está esperando vir do sistema de arquivos ou de um banco de dados ou a rede, então não há necessidade de um thread para se sentar e esperar os dados quando ele pode atender outras solicitações. Em vez disso, a Task pode registrar um retorno de chamada para receber o (s) valor (es) quando estiverem prontos.

Em particular, a Task não diz por que demora tanto tempo para retornar o valor. Pode ser que demore muito tempo para computar, ou pode demorar muito para buscar. Somente no primeiro caso você usaria um Thread para executar uma Task . (No .NET, os threads são muito caros, então você geralmente quer evitá-los o máximo possível e realmente só os usa se você quiser executar vários cálculos pesados ​​em várias CPUs. Por exemplo, no Windows, um thread pesa 12 KiByte ( Eu acho), no Linux, um thread pesa apenas 4 KiByte, em Erlang / BEAM mesmo apenas 400 Byte. No .NET, é 1 MiByte!)


Você pode usar Task para especificar o que deseja fazer e anexar essa Task a um Thread . para que a Task seja executada naquele Thread recém-feito, e não no thread da GUI.

Use Task com o TaskFactory.StartNew(Action action) . Aqui você executa um delegado, então se você não usou nenhum thread, ele seria executado no mesmo thread (thread da GUI). Se você mencionar um thread, poderá executar essa Task em um thread diferente. Isso é um trabalho desnecessário porque você pode executar diretamente o delegado ou anexar esse delegado a um segmento e executar esse delegado nesse segmento. Então não use isso. é apenas desnecessário. Se você pretende otimizar seu software, este é um bom candidato a ser removido.

** Por favor, note que a Action é um delegate .


Além dos pontos acima, seria bom saber que:

  1. Uma tarefa é por padrão uma tarefa em segundo plano. Você não pode ter uma tarefa em primeiro plano. Por outro lado, um segmento pode ser plano de fundo ou primeiro plano (Use IsBackground propriedade para alterar o comportamento).
  2. As tarefas criadas no conjunto de encadeamentos reciclam os encadeamentos, o que ajuda a economizar recursos. Portanto, na maioria dos casos, as tarefas devem ser sua escolha padrão.
  3. Se as operações são rápidas, é muito melhor usar uma tarefa em vez de thread. Para operações de longa duração, as tarefas não oferecem muitas vantagens em relação aos encadeamentos.




task-parallel-library