Frage

Bevor die Leute es vorschlagen: Ich benutze Thread.sleep nicht für irgendetwas Außer versuchen, einen Weg zu finden, um ihn zu umgehen. Ich versuche, den zukünftigen Code anderer Menschen zu bewältigen, der möglicherweise nicht frei () ist. Ich habe ein sehr gutes Verständnis dafür, wie schrecklich es ist, Dinge zu synchronisieren.

Ich akzeptiere einen Thread in einem Stück meines Codes. Ich möchte in der Lage sein, die Lebensdauer dieses Threads zu begrenzen. Meine übliche Methode, dies zu tun, lautet so:

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

Ich habe seitdem entdeckt, dass ich vor dem Schlafengehen anscheinend keinen schlafenden Faden wecken kann. Um die Sache noch schlimmer zu machen, schreibt dies immer noch in die Konsole, wenn ich ihr ein Leben lang 10 Millisekunden gebe:

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

Obwohl mir klar ist .Abort () ist bei der Ausführung von Threads keine schwere Begrenzung. Es scheint, dass 2 Sekunden eine Warnung ausreichen würden, aber ich denke nicht ...

Ich habe versucht, auf den Status von WaitSleepjoin zu suchen, und .Interrupt (); Es stürzt den Thread ab oder bringt eine Ausnahme aus (sorry, unsicher, welche. Windows sagt mir, dass er abgestürzt ist, wenn kein Debugger ausgeführt wird, und wenn es ausgeführt wird, läuft es so, als ob Interrupt nicht gerufen würde), und schreibt immer noch nach 2 Sekunden an die Konsole . .Resume () tut anscheinend nichts mit einem schlafenden Faden.

Ist Gibt es eine Möglichkeit, einen Faden zu wecken, ohne darauf zu warten, dass der Schlaf abläuft? Ich verstehe, dass das Stoppen nicht "unmittelbar" ist, so dass die Konsole.WriteLine unabhängig davon aufgerufen werden kann. Es ist das 2 -Sekunden -Warten, das mich nervt. Was ist, wenn es eine 10 -Tage -Wartezeit ist? Da ich die einkommen, die inszeniert werden, kann ich nicht wissen, und es scheint keine Möglichkeit zu haben verhindern solch eine Sache...

War es hilfreich?

Lösung

Nein, es gibt keinen Weg, einen Faden aus dem Schlaf zu wecken. Sie können einen Thread nur abbrechen, indem Sie abortieren oder unterbrechen (beide eine Threadabortexception).

Aber um Sie zu befragen, warum beim Laufen:

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

Mit einem 10 -m -Zeitlimit -Ausdruck druckt noch Ihr Code zur Steuerung der Thread -Lebenszeit nicht das, was Sie tun möchten.

Sie haben also externe und äußere. Sie starten äußerlich (was einen neuen Thread startet, lassen Sie es Thread 1) und starten Sie beim äußeren Aufruf mit einem externen Thread (wodurch ein neuer Thread gestartet wird. Nennen Sie es Thread 2). Sie haben also gerade zwei neue Themen gestartet.

Wenn du anrufst outer.About(), dieser Abfindung nur Thread 1. Der Thread begann mit dem Aufruf externalThread.Start(), Thread 2 führt weiterhin bis zur Fertigstellung aus, da nichts es abbricht.

Ich bin mir nicht sicher, was Sie mit dem zusätzlichen äußeren Thread erreichen möchten. Wäre das nicht einfacher:

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

Andere Tipps

Verwenden Sie Waitone + Timer, um Threads unbekannter Herkunft zu steuern.

Oder wenn Sie die Kontrolle über den Worker -Code des Threads haben:

Ein bisschen hacky Weg, um mehr "reaktionsschnelle Schlaf" zu erreichen, wenn Timer/andere Threads, mit denen der Thread aufgeweckt wurde

Verwenden Sie es anstelle von normalem Faden.

    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);
        }
    }

Beachten Sie, dass das Fahnen von Sollnits ein Feld ist, das von beiden Threads zugegriffen werden kann

Natürlich hat dies schlechter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top