Dans mon application, je dois effectuer une série d'étapes d'initialisation, qui prennent entre 7 et 8 secondes, pendant lesquelles mon interface utilisateur ne répond 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 sur le BackgroundWorker
et comment cela devrait me permettre de garder mon application réactive sans jamais avoir à écrire un fil pour effectuer de longues tâches, mais je n'ai pas eu de succès en essayant de l'implémenter, quelqu'un pourrait-il dire comment je ferais ceci en utilisant le BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Eamonn McEvoy
la source
la source
Réponses:
Suivre les progrès (facultatif, mais souvent utile)
a) s'abonner à l'
ProgressChanged
événement et l'utiliserReportProgress(Int32)
dansDoWork
b) set
worker.WorkerReportsProgress = true;
(crédits à @zagy)la source
Vous voudrez peut-être également envisager d'utiliser
Task
au lieu de travailleurs d'arrière-plan.Le moyen le plus simple de le faire est dans votre exemple
Task.Run(InitializationThread);
.Il y a plusieurs avantages à utiliser des tâches au lieu de travailleurs d'arrière-plan. Par exemple, les nouvelles fonctionnalités async / await de .net 4.5 sont utilisées
Task
pour le threading. Voici une documentation surTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskla source
BackgroundWorker
. En espérant y diriger les gens.async
etawait
. Ce sont des moyens intégrés dans le langage pour utiliser les tâches de manière beaucoup plus lisible.Aussi, référez-vous au lien ci-dessous, vous comprendrez les concepts de
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
la source
J'ai trouvé ceci ( WPF Multithreading: Utilisation de BackgroundWorker et rapport de la progression à l'interface utilisateur. Lien ) pour contenir le reste des détails qui manquent 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 lors de l'utilisation d'un délégué dans le gestionnaire d'événements de la fenêtre principale, c'était possible.
la source