J'ai un peu de code que je dois exécuter dans un thread différent de l'interface graphique car il provoque actuellement le gel du formulaire pendant l'exécution du code (environ 10 secondes).
Supposons que je n'ai jamais créé de nouveau thread auparavant; quel est un exemple simple / basique de la façon de procéder en C # et en utilisant .NET Framework 2.0 ou version ultérieure?
c#
.net
multithreading
p.campbell
la source
la source
Réponses:
Un bon endroit pour commencer à lire est Joe Albahari .
Si vous souhaitez créer votre propre thread, c'est aussi simple que cela:
la source
IsBackground
true. Il ne fait probablement pas ce que vous pensez qu'il fait. Ce qu'il fait, c'est de configurer si le thread sera tué lorsque tous les threads de premier plan seront morts ou s'il maintiendra l'application en vie. Si vous ne voulez pas que votre thread se termine à mi-exécution, ne définissez pasIsBackground
sur true.BackgroundWorker
semble être le meilleur choix pour vous.Voici mon exemple minimal. Après avoir cliqué sur le bouton, le travailleur d'arrière-plan commencera à travailler dans le fil d'arrière-plan et signalera également sa progression simultanément. Il fera également rapport à la fin des travaux.
Remarque:
ProgressChanged
ouRunWorkerCompleted
gestionnaires. Cependant, la mise à jour de l'interface graphique à partir deDoWork
entraîneraInvalidOperationException
.la source
Le ThreadPool.QueueUserWorkItem est assez idéal pour quelque chose de simple. La seule mise en garde est d'accéder à un contrôle à partir de l'autre thread.
la source
Rapide et sale, mais cela fonctionnera:
Utilisation en haut:
code simple:
Je viens de le jeter dans une nouvelle application console pour un exmaple
la source
Voici une autre option:
la source
Essayez d'utiliser la classe BackgroundWorker . Vous lui donnez des délégués pour ce qu'il faut exécuter et pour être averti lorsque le travail est terminé. Il y a un exemple sur la page MSDN auquel j'ai lié.
la source
Si vous souhaitez obtenir une valeur:
la source
Mettez ce code dans une fonction (le code qui ne peut pas être exécuté sur le même thread que l'interface graphique), et pour déclencher l'exécution de ce code, mettez ce qui suit.
Thread myThread= new Thread(nameOfFunction);
workerThread.Start();
L'appel de la fonction start sur l'objet thread entraînera l'exécution de votre appel de fonction dans un nouveau thread.
la source
nameOfFunction
en arrière-plan et non sur le thread GUI actuel. LaIsBackground
propriété détermine si le thread maintiendra l'application en vie ou non: msdn.microsoft.com/en-us/library/…Voici comment utiliser des threads avec une barre de progression, c'est juste pour comprendre comment les threads fonctionnent, sous la forme il y a trois barres de progression et 4 boutons:
la source
Charles votre code (ci-dessus) n'est pas correct. Vous n'avez pas besoin de tourner pour attendre la fin. EndInvoke se bloquera jusqu'à ce que le WaitHandle soit signalé.
Si vous souhaitez bloquer jusqu'à la fin, vous devez simplement
Ou bien
Mais quel est l'intérêt d'émettre des appels anyc si vous bloquez? Vous pourriez tout aussi bien utiliser un appel synchrone. Un meilleur pari serait de ne pas bloquer et passer une lambda pour le nettoyage:
Une chose à garder à l'esprit est que vous devez appeler EndInvoke. Beaucoup de gens oublient cela et finissent par perdre le WaitHandle car la plupart des implémentations asynchrones libèrent le waithandle dans EndInvoke.
la source
Si vous allez utiliser l'objet Thread brut, vous devez définir IsBackground sur true au minimum et vous devez également définir le modèle Threading Apartment (probablement STA).
Je recommanderais la classe BackgroundWorker si vous avez besoin d'une interaction avec l'interface utilisateur.
la source
une autre option, qui utilise des délégués et le Thread Pool ...
en supposant que «GetEnergyUsage» est une méthode qui prend un DateTime et un autre DateTime comme arguments d'entrée, et retourne un Int ...
la source
int usageCnt = nrgDel.Invoke(lastRunTime, procDT, null, null);
? On dirait qu'il suspend de toute façon le thread actuel avec le sommeil ... Je pensais que cela neIl existe de nombreuses façons d'exécuter des threads distincts dans .Net, chacun a des comportements différents. Avez-vous besoin de continuer à exécuter le thread après la fermeture de l'interface graphique? Avez-vous besoin de transmettre des informations entre le thread et l'interface graphique? Le thread doit-il mettre à jour l'interface graphique? Le thread doit-il effectuer une tâche puis se fermer ou doit-il continuer à s'exécuter? Les réponses à ces questions vous diront quelle méthode utiliser.
Il existe un bon article sur la méthode asynchrone sur la sur le site Web Code Project qui décrit les différentes méthodes et fournit un exemple de code.
Notez que cet article a été écrit avant l' introduction du modèle async / attente et de la bibliothèque parallèle de tâches dans .NET.
la source
Comment: utiliser un fil d'arrière-plan pour rechercher des fichiers
Vous devez être très prudent avec l'accès à partir d'autres threads à des choses spécifiques à l'interface graphique (cela est courant pour de nombreuses boîtes à outils GUI). Si vous souhaitez mettre à jour quelque chose dans l'interface graphique à partir du thread de traitement, vérifiez cette réponse qui, je pense, est utile pour WinForms. Pour WPF, voyez ceci (il montre comment toucher le composant dans la méthode UpdateProgress () pour qu'il fonctionne à partir d'autres threads, mais en fait je n'aime pas qu'il ne le fasse pas
CheckAccess()
avant de le faireBeginInvoke
via Dispathcer, voir et rechercher CheckAccess dedans)Je cherchais un livre spécifique à .NET sur le filetage et j'ai trouvé celui-ci (téléchargeable gratuitement). Voir http://www.albahari.com/threading/ pour plus de détails à ce sujet.
Je crois que vous trouverez ce dont vous avez besoin pour lancer l'exécution en tant que nouveau fil dans les 20 premières pages et il en a beaucoup plus (je ne suis pas sûr des extraits spécifiques à l'interface graphique, je veux dire strictement spécifiques au filetage). Serait heureux d'entendre ce que la communauté pense de ce travail parce que je lis celui-ci. Pour l'instant, cela me semblait plutôt bien (pour montrer les méthodes et les types spécifiques à .NET pour le filetage). Il couvre également .NET 2.0 (et non l'ancienne 1.1) ce que j'apprécie vraiment.
la source
Je recommande de consulter la bibliothèque Power Threading de Jeff Richter et en particulier l'IAsyncEnumerator. Jetez un œil à la vidéo sur Charlie Calvert's blog de où Richter passe en revue pour un bon aperçu.
Ne vous laissez pas rebuter par le nom car cela rend les tâches de programmation asynchrones plus faciles à coder.
la source