Question

existe-t-il un moyen d'abandonner les threads créés avec QueueUserWorkItem ?

Ou peut-être que je n'en ai pas besoin ?Que se passe-t-il si l'application principale se ferme ?Tous les threads créés à partir de celui-ci sont-ils automatiquement abandonnés ?

Était-ce utile?

La solution

Vous n'avez pas besoin de les abandonner.Lorsque votre application se ferme, .NET tuera tous les threads avec IsBackground = true.Le pool de threads .NET a tous ses threads définis sur IsBackground = true, vous n'avez donc pas à vous en soucier.

Désormais, si vous créez des threads en renouvelant la classe Thread, vous devrez soit les abandonner, soit définir leur propriété IsBackground sur true.

Autres conseils

Cependant, si vous utilisez des ressources non gérées dans ces fils, vous pouvez vous retrouver dans beaucoup de problèmes.

Cela dépendrait plutôt de la façon dont vous les utilisiez - si ces ressources non gérées étaient correctement encapsulées, elles seraient alors traitées par la finalisation de leur wrapper, quel que soit le mécanisme utilisé pour tuer les threads qui les avaient référencées. Et les ressources non gérées sont libérées par le système d’exploitation lorsqu’une application se ferme de toute façon.

Il existe un sentiment général selon lequel les applications (Windows) passent beaucoup trop de temps à essayer de nettoyer à la fermeture de l'application - ce qui implique souvent de paginer d'énormes quantités de mémoire juste pour qu'elle puisse être à nouveau supprimée (ou de paginer du code qui s'exécute partout). libérant les objets non gérés que le système d'exploitation gérerait de toute façon).

Le pool de threads utilise des threads d'arrière-plan.Par conséquent, ils seront tous fermés automatiquement à la fermeture de l’application.

Si vous souhaitez abandonner un thread vous-même, vous devrez soit gérer le thread vous-même (afin de pouvoir appeler Thread.Abort() sur l'objet thread), soit configurer une forme de mécanisme de notification qui vous permettra dites au thread qu'il doit s'abandonner.

Oui, il le feront.Cependant, si vous utilisez des ressources non gérées dans ces threads, vous risquez de vous retrouver avec de nombreux problèmes.

ouais, ils sont en arrière-plan, mais par exemple, si vous avez une application dans laquelle vous utilisez ThreadPool pour des téléchargements ou des trucs multiples, et que vous voulez les arrêter, comment arrêtez-vous ?ma suggestion serait:quitter le fil de discussion dès que possible, par exemple

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

et si vous définissez stop = true, les deuxièmes threads (actuellement dans la file d'attente) se terminent automatiquement, une fois que les threads de la file d'attente ont terminé leur processus.

D'après la réponse de Lukas Šalkauskas.

Mais vous devriez utiliser :

volatile bool stop = false;

pour indiquer au compilateur que cette variable est utilisée par plusieurs threads.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top