BackgroundWorker vs. Async / Await

16

Sou novo no desenvolvimento do C # e desejo criar uma interface do usuário mais responsiva. Na minha pesquisa preliminar, vi dois métodos para alcançar isso:

  1. Multithreading em conjunto com a classe BackgroundWorker.
  2. Os novos modificadores Async / Await.

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

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

    
por robert.ecot 26.02.2013 / 18:54
fonte

3 respostas

9

Você poderá realizar sua tarefa usando BackgroundWorker . É uma classe bem conhecida, e muitas pessoas a usam.

As novas palavras-chave C # 5 async e await basicamente 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, em vez de BackgroundWorker .

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

    
por 26.02.2013 / 19:05
fonte
13

As palavras-chave async e await não tornarão sua inscrição mais responsiva por conta própria. Eles simplesmente fazem a chamada e a manipulação de métodos que retornam Task objetos mais convenientes. Para fazer com que async / await use tópicos 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 em que usei isso foi para manipular eventos provenientes de um controle WebBrowser .
  • Outros métodos async , como muitas das funções da API do Win 8.

Em outras palavras, async / await é uma extensão da Tarefa Padrão Assíncrono Baseado . Você pode encontrar uma grande quantidade de informações, incluindo muitos exemplos, aqui .

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

Outra opção não mencionada são as Extensões reativas para .NET . Este é outro excelente framework para adicionar capacidade de resposta aos seus aplicativos.

    
por 26.02.2013 / 20:21
fonte
3

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

Por causa disso, acho que você deve preferir usar async - await over BackgroundWorker .

    
por 26.02.2013 / 20:59
fonte