Je suis un débutant avec WPF , dans mon application, je dois effectuer une série d’étapes d’initialisation, celles-ci prennent 7 à 8 secondes pour que mon interface utilisateur ne réponde plus. Pour résoudre ce problème, j’effectue l’initialisation dans un thread séparé:
public void Initialization() { Thread initThread = new Thread(new ThreadStart(InitializationThread)); initThread.Start(); } public void InitializationThread() { outputMessage("Initializing..."); //DO INITIALIZATION outputMessage("Initialization Complete"); }
J’ai lu quelques articles à propos de BackgroundWorker
et comment cela devrait me permettre de garder mon application réactive sans avoir à écrire un thread pour effectuer de longues tâches, mais je n’ai pas réussi à l’implémenter. faire cela en utilisant le BackgroundWorker
?
Merci Eamonn
1.Ajoute à l’aide de: using System.ComponentModel;
2.Déclarer le travailleur de base :
private readonly BackgroundWorker worker = new BackgroundWorker();
3. S’abonner à des événements:
worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted;
4. implémenter deux méthodes:
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.Exécutez le travailleur asynchrone à chaque fois que vous en avez besoin.
worker.RunWorkerAsync();
En outre, si vous souhaitez signaler la progression du processus, vous devez vous inscrire à l’événement ProgressChanged
et utiliser ReportProgress(Int32)
dans la méthode DoWork
pour générer un événement. Également défini comme suit: worker.WorkerReportsProgress = true;
(merci à @zagy)
J’espère que cette aide
Vous voudrez peut-être également vous pencher sur l’utilisation de Task
plutôt que sur des travailleurs en arrière-plan.
La manière la plus simple de le faire est dans votre exemple Task.Run(InitializationThread);
.
Il y a plusieurs avantages à utiliser des tâches plutôt que des travailleurs de base. Par exemple, les nouvelles fonctionnalités asynchrones / attendues dans .net 4.5 utilisent la Task
pour le threading. Voici une documentation sur la 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(ssortingng[] 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); } } } }
En outre, le lien ci-dessous vous permettra de comprendre les concepts de Background
:
http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
En plus de ce que Andrew Orsich a dit, vous voudrez peut-être lire quelques exemples à ce sujet.
voici un exemple de code utilisant un agent d’arrière-plan et une barre de progression
http://devtoolshed.com/content/c-download-file-progress-bar
et voici un petit tutoriel
http://www.dotnetperls.com/backgroundworker
et il y a un lien pour un autre exemple de progressbar + backgroundworker à la fin du tutoriel.
J’ai trouvé cela ( lien WPG Multithreading: Utilisation de BackgroundWorker et Reporting the Progress à l’interface utilisateur. ) Pour contenir le rest des détails manquants dans la réponse de @ Andrew.
La seule chose que j’ai trouvée très utile était que le thread de travail ne pouvait pas accéder aux contrôles de MainWindow (dans sa propre méthode), mais que l’utilisation d’un délégué dans le gestionnaire d’événements Windows principal était possible.
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; };
Essayez ce lien BackgroundWorker Class dans MSDN qui contient un exemple d’utilisation.