Как использовать WPF Background Worker
Я новичок с WPF в моем приложении мне нужно выполнить процедуру инициализации, это займет 7-8 секунд, в течение которых мой интерфейс перестает отвечать на запросы. Чтобы решить эту проблему, я выполняю инициализацию в отдельном потоке:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Я прочитал несколько статей о BackgroundWorker и как это должно позволить мне сохранить мое приложение отзывчивым без необходимости писать поток для выполнения длительных задач, но у меня не было никакого успеха пытаясь реализовать его, может ли кто-нибудь сказать, как я это сделаю, используя BackgroundWorker?
спасибо,
Имон
6 ответов:
1.Добавить следующее С помощью:
using System.ComponentModel;2.Объявить фон рабочего:
private readonly BackgroundWorker worker = new BackgroundWorker();3.Подписка на события:
worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted;4.Реализовать два метода:
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.Запустите рабочий асинхронный всякий раз, когда вам нужно.
worker.RunWorkerAsync();кроме того, если вы хотите сообщить о ходе процесса вы должны подписаться на
ProgressChangedсобытие и использоватьReportProgress(Int32)наDoWorkметод для вызова события. Также установите следующее:worker.WorkerReportsProgress = true;(спасибо @zagy)надеюсь, что это поможет.
вы можете также посмотреть на использование
Taskвместо фоновых работников.самый простой способ сделать это в вашем примере
Task.Run(InitializationThread);.есть несколько преимуществ для использования задач вместо фоновых работников. Например, новые функции async / await в .net 4.5 используют
Taskдля нарезания резьбы. Вот некоторые документы оTaskhttp://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); } } } }кроме того, обратитесь к ссылке ниже вы поймете концепции
Background:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
в дополнение к тому,что сказал Эндрю Орсич, может быть, вы хотите прочитать некоторые примеры об этом.
вот пример кода с использованием background worker и progressbar
http://devtoolshed.com/content/c-download-file-progress-bar
и вот небольшой учебник
http://www.dotnetperls.com/backgroundworker
и есть ссылка на другой пример progressbar + backgroundworker в конце из учебника.
Я нашел это (многопоточность WPF: использование BackgroundWorker и отчет о ходе работы в пользовательском интерфейсе. ссылка), чтобы содержать остальные детали, которые отсутствуют в ответе @Andrew.
одна вещь, которую я нашел очень полезной, заключалась в том, что рабочий поток не мог получить доступ к элементам управления MainWindow (в своем собственном методе), однако при использовании делегата внутри главного обработчика событий windows это было возможно.
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; };
попробуйте эту ссылку класс BackgroundWorker в MSDN который содержит пример того, как его использовать.
Comments