Como usar o WPF Background Worker

Eu sou um iniciante com WPF , no meu aplicativo eu preciso executar uma série de etapas de boot, estas levam 7-8 segundos para concluir durante o qual minha interface do usuário não responde. Para resolver isso, executo a boot 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 o BackgroundWorker e como ele deve permitir que eu mantenha meu aplicativo responsivo sem nunca ter que escrever um thread para executar tarefas demoradas, mas eu não tive nenhum sucesso tentando implementá-lo, alguém poderia dizer como eu faria? fazer isso usando o BackgroundWorker ?

Obrigado, Eamonn

1.Adicionar o seguinte usando: using System.ComponentModel;

Trabalhador de fundo 2.Declare:

 private readonly BackgroundWorker worker = new BackgroundWorker(); 

3. Inscrever-se para events:

 worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; 

4.Implement dois methods:

 private void worker_DoWork(object sender, DoWorkEventArgs e) { // run all background tasks here } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //update ui once worker complete his work } 

5. Execute o trabalho asynchronous sempre que precisar.

 worker.RunWorkerAsync(); 

Além disso, se você quiser relatar o andamento do processo, inscreva-se no evento ProgressChanged e use ReportProgress(Int32) no método DoWork para gerar um evento. Também defina a seguir: worker.WorkerReportsProgress = true; (graças a @zagy)

Espero que esta ajuda.

Você também pode querer usar o Task vez de usar Task background workers.

A maneira mais fácil de fazer isso é no seu exemplo é Task.Run(InitializationThread); .

Há vários benefícios em usar tarefas em vez de trabalhadores em segundo plano. Por exemplo, os novos resources async / await no .net 4.5 usam Task para encadeamento. Aqui está alguma documentação sobre a Task http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx

 using System; using System.ComponentModel; using System.Threading; namespace BackGroundWorkerExample { class Program { private static BackgroundWorker backgroundWorker; static void Main(string[] args) { backgroundWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; backgroundWorker.DoWork += backgroundWorker_DoWork; //For the display of operation progress to UI. backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; //After the completation of operation. backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted; backgroundWorker.RunWorkerAsync("Press Enter in the next 5 seconds to Cancel operation:"); Console.ReadLine(); if (backgroundWorker.IsBusy) { backgroundWorker.CancelAsync(); Console.ReadLine(); } } static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 200; i++) { if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } backgroundWorker.ReportProgress(i); Thread.Sleep(1000); e.Result = 1000; } } static void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine("Completed" + e.ProgressPercentage + "%"); } static void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { Console.WriteLine("Operation Cancelled"); } else if (e.Error != null) { Console.WriteLine("Error in Process :" + e.Error); } else { Console.WriteLine("Operation Completed :" + e.Result); } } } } 

Além disso, consulte o link abaixo para entender os conceitos de Background :

http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/

Além do que Andrew Orsich disse, talvez você queira ler alguns exemplos sobre isso.

aqui está um código de exemplo usando o trabalhador de plano de fundo e uma barra de progresso

http://devtoolshed.com/content/c-download-file-progress-bar

e aqui está um pequeno tutorial

http://www.dotnetperls.com/backgroundworker

e há um link para outro exemplo de progressbar + backgroundworker no final do tutorial.

Eu encontrei este ( WPF Multithreading: Usando o BackgroundWorker e relatando o progresso para a interface do usuário. Link ) para conter o resto dos detalhes que estão faltando na resposta do @ Andrew.

A única coisa que achei muito útil foi que o thread de trabalho não podia acessar os controles da MainWindow (em seu próprio método), no entanto, ao usar um delegado dentro do manipulador de events do Windows principal, era possível.

 worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) { pd.Close(); // Get a result from the asynchronous worker T t = (t)args.Result this.ExampleControl.Text = t.BlaBla; }; 

Tente este link Classe BackgroundWorker no MSDN, que contém um exemplo de como usá-lo.