No meu aplicativo, preciso executar uma série de etapas de inicialização, que levam de 7 a 8 segundos para serem concluídas, durante as quais minha interface do usuário fica sem resposta. Para resolver isso, eu executo a inicialização em um thread separado:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Eu li alguns artigos sobre oe BackgroundWorker
como ele deve permitir que eu mantenha meu aplicativo responsivo sem precisar escrever um thread para executar tarefas demoradas, mas não tive sucesso ao tentar implementá-lo. Alguém poderia dizer como eu faria isso usando o BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Eamonn McEvoy
fonte
fonte
Respostas:
Acompanhar o progresso (opcional, mas geralmente útil)
a) assinar o
ProgressChanged
evento e usarReportProgress(Int32)
emDoWork
b) definido
worker.WorkerReportsProgress = true;
(créditos para @zagy)fonte
Você também pode querer usar os
Task
trabalhadores em segundo plano, em vez dos de segundo plano.A maneira mais fácil de fazer isso é no seu exemplo
Task.Run(InitializationThread);
.Existem vários benefícios em usar tarefas em vez de trabalhadores em segundo plano. Por exemplo, os novos recursos assíncronos / aguardados no .net 4.5 usam
Task
para encadeamento. Aqui está alguma documentação sobreTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskfonte
BackgroundWorker
. Na esperança de orientar as pessoas para isso.async
eawait
. Essas são formas integradas de linguagem para usar tarefas de uma maneira muito mais legível.Além disso, consulte o link abaixo para entender os conceitos de
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
fonte
Achei isso ( WPF Multithreading: Usando o BackgroundWorker e Reporting the Progress to the UI. Link ) para conter o restante dos detalhes que estão faltando na resposta de @ Andrew.
A única coisa que achei muito útil foi que o thread de trabalho não pôde acessar os controles do MainWindow (em seu próprio método); no entanto, ao usar um delegado dentro do manipulador de eventos do Windows principal, era possível.
fonte