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:
- Multiencadeamento em conjunto com a classe BackgroundWorker.
- 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.
c#
.net
multithreading
async
robert.ecot
fonte
fonte
Respostas:
Você será capaz de realizar sua tarefa usando
BackgroundWorker
. É uma classe bem conhecida, e muitas pessoas a usaram.O novo C # 5
async
e asawait
palavras - 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-chaveBackgroundWorker
.A menos que você precise usar uma versão mais antiga do C #, sugiro aprender a usar
async
eawait
.fonte
As palavras
async
-await
chave 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 retornamTask
objetos mais convenientes. Para criarasync
/await
realmente usar threads de segundo plano, você precisará combinar com o uso de coisas como:Task.Start()
- Inicia uma determinada tarefa usando oTaskScheduler
.TaskCompletionSource
- Uma maneira personalizada de lidar com tarefas assíncronas. Um lugar que eu usei isso foi lidar com eventos provenientes de umWebBrowser
controle.async
mé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 noDoWork
manipulador 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.
fonte
BackgroundWorker
, especificamente, seja recomendável.Eu diria que
async
-await
é muito mais flexível do queBackgroundWorker
. E se você quiser fazer algo que se encaixaBackgroundWorker
, você pode fazê-lo comasync
-await
também, com código de tipo seguro mais legível e mais.Por isso, eu acho que você deve preferir usar
async
-await
maisBackgroundWorker
.fonte