Diferenças de Delegados vs BackgroundWorker?

Alguém pode explicar a diferença entre Delegados e BackgroundWorker? Nesse caso, Backgroundworker é mais eficiente que Delegado? Como estamos tendo um delegado asynchronous, qual é a necessidade de usar o BackGroungWorker.

BackgroundWorker :

A class BackgroundWorker permite que você execute uma operação em um thread dedicado separado.

Delegate :

Um delegado é um tipo que define uma assinatura de método. … Os delegates são usados ​​para passar methods como argumentos para outros methods.


A questão de qual usar não tem nada a ver com eficiência.

BackgroundWorker é um wrapper que simplifica o trabalho com threads, você também pode usar delegates asynchronouss, mas gerenciá-los corretamente é muito mais difícil. Ou, no MSDN:

Quando você deseja uma interface de usuário responsiva e enfrenta longos atrasos associados a essas operações, a class BackgroundWorker fornece uma solução conveniente.

Eu tenho uma breve comparação de BackgroundWorker , delegates asynchronouss e outras abordagens no meu blog (a partir da perspectiva de fazer operações em segundo plano).

BackgroundWorker tem estas vantagens:

  • O relatório de progresso é fácil. Qualquer BackgroundWorker cuja propriedade WorkerSupportsProgress seja verdadeira pode relatar o progresso. O delegado DoWork pode invocar ReportProgress , que faz com que o evento ProgressChanged seja triggersdo.
  • Existe um sistema integrado para cancelamento cooperativo. O thread de cancelamento primeiro chama BackgroundWorker.CancelAsync . Isso faz com que a propriedade BackgroundWorker.CancellationPending se torne verdadeira. O delegado DoWork deve monitorar essa propriedade (verificando-a regularmente) e definir DoWorkEventArgs.Cancel como true e retornar se a operação for cancelada. O delegado RunWorkerCompleted detecta um resultado cancelado, verificando RunWorkerCompletedEventArgs.Cancelled .
  • A synchronization é automática, tanto para indicações de conclusão como para relatórios de progresso. Os events ProgressChanged e RunWorkerCompleted são sincronizados com o SynchronizationContext que estava em vigor quando o RunWorkerAsync foi chamado.

Delegados asynchronouss têm essa vantagem:

  • Retornar um valor é simples; acabou de voltar.

Concluindo, recomendo usar a Task vez de BackgroundWorker ou delegates asynchronouss.

O trabalhador em segundo plano é principalmente para o trabalho da interface do usuário, no qual você precisa executar facilmente uma tarefa em um thread de segundo plano e fornecer atualizações de progresso para a canvas.

Uma vantagem é que ele chama seus retornos de chamada para o thread da interface do usuário para que você não precise verificar se InvokeRequired etc.

Os delegates são um mecanismo mais geral para passar funções como argumentos e, ao executá-los de forma assíncrona, oferecem uma maneira fácil de executar esses methods em outro thread.

Trabalhador em segundo plano é uma abstração para ajudá-lo a executar uma operação em um thread separado.

Os delegates realmente não iniciam threads separados – eles são um tipo de referência a methods.

Mas o que você provavelmente está interessado é quando você deve usar methods asynchronouss em vez de usar o plano de fundo. Eu não tenho muita experiência nisso, mas Anders Hejlsberg falou sobre isso em sua session de PDC sobre o Futuro do C # .

A mensagem que recebi foi que, em algumas circunstâncias, os methods asynchronouss seriam preferíveis por causa da menor complexidade. O thread da interface do usuário ainda estaria bloqueado, mas não por tanto tempo que isso importasse.