BackgroundWorker vs. Async / Await


16

Eu sou novo no desenvolvimento de C # e desejo criar uma interface de usuário mais responsiva. Na minha pesquisa preliminar, vi dois métodos para conseguir isso:

  1. Multiencadeamento em conjunto com a classe BackgroundWorker.
  2. Os modificadores Async / Await mais recentes.

Mais recente significa melhor? Qual é a diferença entre os dois métodos? Se eu desejar criar um novo projeto, como escolho qual método seguir?

EDIT: Talvez eu deva especificar. Estou criando um aplicativo Windows Forms, onde todos os dados necessários serão salvos / carregados no disco local. Eu também estarei me comunicando com vários dispositivos USB.


Respostas:


10

Você será capaz de realizar sua tarefa usando BackgroundWorker. É uma classe bem conhecida, e muitas pessoas a usaram.

O novo C # 5 asynce as awaitpalavras - chave facilitam a gravação de código assíncrono legível. Pode haver menos tutoriais e exemplos de como realizar várias tarefas com essas palavras-chave BackgroundWorker.

A menos que você precise usar uma versão mais antiga do C #, sugiro aprender a usar asynce await.


13

As palavras async- awaitchave e não tornarão seu aplicativo mais responsivo por conta própria. Eles simplesmente tornam a chamada e o manuseio de métodos que retornam Taskobjetos mais convenientes. Para criar async/ awaitrealmente usar threads de segundo plano, você precisará combinar com o uso de coisas como:

  • Task.Start()- Inicia uma determinada tarefa usando o TaskScheduler.
  • PLINQ - Executa uma série de operações em paralelo, retorna uma Tarefa.
  • TaskCompletionSource- Uma maneira personalizada de lidar com tarefas assíncronas. Um lugar que eu usei isso foi lidar com eventos provenientes de um WebBrowsercontrole.
  • Outros asyncmétodos, como muitas das funções na API do Win 8.

Em outras palavras, async/ awaité uma extensão do Padrão Assíncrono Baseado em Tarefas . Você pode encontrar uma grande variedade de informações, incluindo muitas amostras, aqui .

O BackgroundWorkeré um componente WinForms que cria 1 thread em segundo plano usando o padrão assíncrono baseado em evento e você pode preencher o trabalho realizado nesse thread em segundo plano com seu próprio código no DoWorkmanipulador de eventos. Em geral, a Microsoft não recomenda mais usar esse padrão (consulte a parte inferior da página aqui ), mas se você já estiver familiarizado com ele, ainda poderá ser uma opção simples.

Outra opção não mencionada, são as Extensões Reativas para .NET . Essa é outra excelente estrutura para adicionar capacidade de resposta aos seus aplicativos.


Quando você diz a API do Win 8, isso implica que os recursos assíncronos não são tão bem suportados no Windows 7 (minha plataforma de destino)?
26813 robert.ecot

1
Olá Robert, o Win 8 .NET API (para aplicativos do tipo "Metro") usando assíncrono e aguarda muito por tudo, desde E / S de arquivo até mostrar caixas de diálogo. Em outros componentes do .NET, por exemplo, FileStream, você também pode usar async / waitit com métodos como Stream.ReadAsync. Portanto, também há suporte fora do Win 8.
Kevin McCormick

Ótimo, e obrigado pelos links atualizados também! Muito útil.
26613 robert.ecot

1
Não vejo nada nessa página indicando que BackgroundWorker, especificamente, seja recomendável.
23715 Kyralessa

Também recomendo a leitura do Async VS BackgroundWorker e a série de postagens de blog sobre programação simultânea em C # de Stephen Clearly, autor do livro omônimo publicado por O'Reilly.
sentenza

3

Eu diria que async- awaité muito mais flexível do que BackgroundWorker. E se você quiser fazer algo que se encaixa BackgroundWorker, você pode fazê-lo com async- awaittambém, com código de tipo seguro mais legível e mais.

Por isso, eu acho que você deve preferir usar async- awaitmais BackgroundWorker.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.