J'utilise c # .NET4.0 en vs 2010.
Comment redémarrer un fichier c'est comme je veux code>? P>
avortement () code> le thread et start () code> it du début?
Est-ce possible? P>
5 Réponses :
Abandonner un fil est souvent une mauvaise idée. Il est conseiller. Si c'est une boucle infinie, une booléenne utilisait le fil sans l'avortement.
bool run = true;
Thread thread = new Thread(method);
thread.start();
private void method()
{
while(run)
{
}
}
Bon conseil. Exécuter code> doit être volatile code> pour éviter toute attente indéfinie en raison des optimisations du compilateur.
Pensez à utiliser code> verrouillage code>, inspécialement lors de la réglage de la valeur booléenne. Encore mieux, en l'utilisant en conjonction avec moniteur code>. Regardez ici: Stackoverflow .com / questions / 1559293 / ...
Ma fonction de thread commence lorsque je clique pour créer un serveur. Il effectue une certaine initialisation puis va dans une boucle infinie contenant une socket.accept (). Le contrôle est bloqué sur cette déclaration afin que je ne puisse pas utiliser cette méthode de verrouillage.
@Ys.: Lire ou écrire un booléen dans .NET est garanti d'être atomique b>. Ainsi, pas de verrouillage ni de moniteur requis. Stackoverflow .com / questions / 59422 / ...
Verrouiller == moniteur. Voir ici ou ici
Mais j'ai une prise en attente d'acceptation de connexion à l'intérieur. Même si je définis le exécuté = false code>, il sera toujours bloqué à cette ligne.
thread.Abort ne garantit pas que le fil se termine. Par exemple, si vous avez une requête longue en cours d'exécution, ABort ne terminera pas l'exécution de la requête ou l'annulation du fil. En fait, le fil vivra jusqu'à la fin de la requête. P>
Si vous faites tout dans le code géré et que vous n'êtes pas enfermé par des ressources non gérées, vous devez abandonner un thread, filort.Abort () est parfaitement bien. P>
Cependant, vous ne pouvez pas appeler démarrer sur un fil qui a été résilié. Vous devrez créer un autre fil et appelez-vous sur ce fil. La création de fil est quelque peu chère, mémoire sage de mémoire, en .NET (par rapport aux autres langatuges), il y a donc des inconvénients. p>
Créer réellement le fil à nouveau et encore ne sera pas trop cher car il ne sera pas fait très fréquemment.
Lorsque vous souhaitez redémarrer le fil à partir du début, vous souhaitez réellement redémarrer une exécution de certaines fonctions (flux de code) sur le thread. Lorsque vous créez un fil et passez une fonction d'exécution, une vie de fil sera terminée dès que la fonction finit sa propre exécution. Il vous suffit de modifier votre conception de code qui permettra de redémarrer la fonction avec recréer un nouveau fil. Mais pour les fonctions courtes, je conseillerais d'utiliser threadpool < / a>. p>
Puisque vous utilisez .NET 4.0, où MS avait introduit le "Cadre d'annulation coopératif". Vous pouvez en lire plus de ce blog . Traiter directement avec le fil est (de plus en plus) découragé. P>
Créer une nouvelle instance de fil et exécuter à nouveau. fil1 = nouveau thread (); thread1.start (); p>
En général,
Abort () code> Un thread est une mauvaise idée. Quel problème voulez-vous résoudre?Cela pourrait vous aider: - [redémarrer un fil dans C # 4.0] [1] [1]: Stackoverflow.com/Questtions/1054889/...
L'obligation d'arrêter et de démarrer le thread est un peu inhabituelle - quel est le problème que vous essayez de résoudre?
J'ai un thread de serveur qui initialise d'abord une prise, puis accepte à plusieurs reprises des connexions entrantes ... Nous pouvons fermer le serveur à la fermeture de la prise, il utilise et d'abandonner le fil ... maintenant si je veux démarrer le serveur, j'ai besoin La fonction de fil à exécuter à nouveau ...