Question

Avant que les gens donnent à penser qu'il: Je n'utilise pas Thread.sleep pour quoi que ce soit , sauf en essayant de trouver un moyen de travailler autour d'elle. Je suis en train de gérer le code de l'avenir d'autres personnes qui peuvent ne pas être libre .Sleep (). J'ai une très bonne connaissance de la façon dont il est horrible pour synchroniser les choses.

J'accepte un fil dans un morceau de mon code. Je veux être en mesure de fixer une limite à la durée de vie de ce fil. Ma méthode habituelle de le faire va comme ceci:

Thread outer = new Thread(() =>
{
    externalThread.Start();
    externalThread.Join();
});
outer.Start();
outer.Join(lifetime);
if (outer.ThreadState != ThreadState.Stopped)
{
    outer.Abort();
}
inner.Join();

Je l'ai découvert depuis que je ne peux pas apparemment réveiller un fil dormant avant la fin du sommeil. Pour empirer les choses, cela écrit encore à la console si je lui donne une durée de vie de 10 millisecondes:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

Bien que je me rends compte .Abort () n'est pas un disque limite sur l'exécution du fil. Il semble 2 secondes serait un avertissement suffisant, mais je pense pas ...

J'ai essayé de vérifier le statut WaitSleepJoin et .Interrupt (); il plante le fil, ou lance une exception (désolé, ne sachant pas qui. Windows me dit qu'il plantait si en cours d'exécution, ce ne débogueur et si elle est en cours d'exécution, il fonctionne comme si interruption n'a pas été appelé), et écrit encore à la console au bout de 2 secondes . .Resume () ne semble rien à un fil de couchage.

il un moyen de réveiller un fil, sans attendre son sommeil expirer? Je comprends que l'arrêt n'est pas « immédiate », de sorte que Console.WriteLine peut être appelé indépendamment; il est les 2 secondes d'attente qui me casser les pieds. Et si c'est une attente de 10 jours? Puisque je ne peux pas contrôler les fils qui viennent, je n'ai aucun moyen de savoir, et il ne semble pas possible de empêchant une telle chose ...

Était-ce utile?

La solution

Non, il n'y a aucun moyen d'un fil se réveiller d'un sommeil. Vous ne pouvez Abandonner un fil en appelant Abandonner ou Interrompre (tous deux lancer une ThreadAbortException).

Mais vous adresse question de savoir pourquoi lors de l'exécution:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

avec un délai d'expiration 10ms encore des impressions, c'est parce que votre code pour contrôler la durée de vie de fil ne fait pas ce que vous voulez faire.

Donc, vous avez externalThread et extérieur. Vous commencez extérieur (qui démarre un nouveau thread, permet de l'appeler fil 1) et du début d'appel extérieur sur filetage extérieur (qui commence un nouveau fil, permet de l'appeler Enfilez 2). Donc, vous venez de lancer deux nouveaux threads.

Lorsque vous appelez outer.About(), que Abandonne seul fil 1. Le fil a commencé en appelant externalThread.Start(), fil 2 continue à exécuter à la fin puisque rien ne l'annuler.

Je ne suis pas sûr de ce que vous êtes en train d'accomplir avec le fil externe supplémentaire. Ne serait-ce pas plus simple:

externalThread.Start();
externalThread.Join(lifetime);
if (externalThread.ThreadState != ThreadState.Stopped)
{
    externalThread.Abort();
}

Autres conseils

Utilisation WaitOne + minuterie pour fils de commande d'origine inconnue.

ou si vous avez le contrôle sur le code de travail du fil:

façon un peu hacky, pour atteindre plus « sommeil réactif » lorsqu'ils ne sont pas goût minuteries / autres threads utilisés pour réveiller le fil vers le haut

utiliser à la place de Thread.Sleep normale

    private void WaitFor(int milis)
    {
        const int interval = 500;

        if (milis <= interval)
        {
            throw new ArgumentException();
        }

        var sections = milis / interval;
        for (var s = 0; s < sections && (!ShouldQuit); ++s)
        {
            Thread.Sleep(interval);
        }
    }

remarque l'indicateur ShouldQuit, étant un champ de classe accessible à la fois des fils

Bien sûr, cela a pire caractéristiques que l'utilisation du processeur d'attente basée sur des événements / timer

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