Est-il un moyen de réveiller un thread en sommeil?
Est-il un moyen de le réveiller d'un sommeil thread en C#? Donc, avoir sommeil, soit pour une longue période et se réveiller quand vous voulez travailler traitées?
Dans quel contexte exactement? Nous avons vraiment besoin de plus d'informations sur la plate-forme et/ou le modèle de thread que vous utilisez pour être en mesure de répondre à cela de façon significative.
Il dépend de la façon dont vous le mettre en veille.
Vous avez certainement au moins nous dire ce langage de programmation de cette question.
C'est en C# j'ai pensé qu'il pourrait être dépendant d'une langue.
Voici un post utile en toute sécurité réveiller et de sortir d'un sommeil C# fil sans Fil.Abort() sur cette.
Il dépend de la façon dont vous le mettre en veille.
Vous avez certainement au moins nous dire ce langage de programmation de cette question.
C'est en C# j'ai pensé qu'il pourrait être dépendant d'une langue.
Voici un post utile en toute sécurité réveiller et de sortir d'un sommeil C# fil sans Fil.Abort() sur cette.
OriginalL'auteur spig | 2010-08-11
Vous devez vous connecter pour publier un commentaire.
Un
AutoResetEvent
objet (ou d'une autreWaitHandle
mise en œuvre) peut être utilisé pour dormir jusqu'à ce qu'un signal à partir d'un autre thread est reçu:OriginalL'auteur
Si votre fil est à l'intérieur d'un appel à
Sleep
, alors il n'y a pas (généralement) un moyen de le réveiller. (La seule exception que je suis conscient de l'est de Java, qui permet à un sommeil de mettre fin à un si un autre thread appellethread.interrupt()
.)Le modèle que vous parlez semble appeler à un événement: le thread contient une boucle, au sommet de laquelle il attend un événement à feu. Si l'événement n'est actuellement pas défini, alors le fil "dort" jusqu'à ce qu'un autre thread déclenche l'événement. À ce moment, le thread en sommeil se réveille et continue son travail, jusqu'à la prochaine fois par la boucle quand il dort à attendre pour un autre événement.
juste assez, je vais supprimer mon commentaire 🙂
OriginalL'auteur
Il est en fait un fil de discussion.Interrupt() méthode en C#.
Alors que l'on a accepté la réponse ne décrit un bon modèle qui vous voudrez probablement dans votre cas, j'en suis venu à cette question à la recherche pour le Fil.Interrompre si je suis le mettre ici.
OriginalL'auteur
La meilleure solution serait d'utiliser
Task
objets avec la valeur par défautTaskFactory
. Cette API (introduit en .NET 4.0) utilise un pool de threads avec vol de travail files d'attente et tous les trucs de fantaisie.Si .NET 4.0 n'est pas disponible, puis utilisez le
ThreadPool
, qui a un construit-dans la file d'attente de travail (qui fait un peu de la piscine de l'équilibrage, mais pas sur le même champ d'application que la 4.0 pool de threads).Si vous avez vraiment doit le faire vous-même, alors je vous recommande un
BlockingCollection<T>
, qui est un blocage consommateur/producteur de la file d'attente .NET 4.0.Si vous avez vraiment doit le faire vous-même et ne pouvez pas utiliser .NET 4.0, vous pouvez utiliser un
ManualResetEvent
ouAutoResetEvent
avec unlock
protégé de la file d'attente de travail.OriginalL'auteur
Serait cette thread de l'aide? C# a une bonne fonctionnalité pour le thread de gestion des Événements. J'ai fait la plupart de mon travail en Python, mais C# semble avoir de solides bibliothèques de blocage du thread.
OriginalL'auteur
Basé sur Ilia suggestion:
et...
Cette solution est brut, comme il peut y avoir d'autres raisons pour lesquelles les
ThreadInterruptedException
est levée.OriginalL'auteur
L'expansion de Wim de réponse, vous pouvez également spécifier un délai pour la
WaitHandle.WaitOne()
appel. De sorte que vous pouvez utiliser à la place deThread.Sleep()
.CancellationToken
struct vous offre une option de sorte que vous pouvez signaler votre charge comme ceci:OriginalL'auteur