Interrupt einen schlafenden Thread

Gibt es eine Möglichkeit zu Unterbrechen, einen schlafenden thread? Wenn ich code wie diesem.

while(true){
    if(DateTime.Now.Subtract(_lastExecuteTime).TotalHours > 1){
        DoWork();
        _lastExecuteTime = DateTime.Now();
        continue; 
    }
    Thread.Sleep(10000) //Sleep 10 seconds
    if(somethingIndicatingQuit){
        break;
    }

}

Ich bin zu wollen ausführen DoWork() jede Stunde. Also, ich würde gerne ein wenig schlafen länger als 10 Sekunden. Sagen überprüfen Sie alle 10 Minuten oder so. Allerdings, wenn mein Schlaf bis 10 Minuten, und ich töten will diesem hintergrund die Aufgabe, ich muss warten, bis der Schlaf wieder aufzunehmen.

Meine eigentliche code ist mit einem Gewinde versehen.ManualResetEvent Herunterfahren die Arbeit im hintergrund, aber mein Problem ist mit der ThreadSleep code. Ich poste mehr code, wenn nötig.

OK, ich werde hinzufügen ein bisschen mehr code komplett hier, wie ich denke, es wird einige Fragen beantworten.

private readonly ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private readonly ManualResetEvent _pauseEvent = new ManualResetEvent(true);
private Thread _backGroundWorkerThread;

//This starts our work
public void Start() {
    _backGroundWorkerThread = new Thread(ExecuteWorker) {IsBackground = true, Name = WorkerName + "_Thread"};
    _shutdownEvent.Reset();
    _backGroundWorkerThread.Start();
}
internal void Stop() {
    //Signal the shutdown event
    _shutdownEvent.Set();

    //Make sure to resume any paused threads
    _pauseEvent.Set();

    //Wait for the thread to exit
    _backGroundWorkerThread.Join();

}

private void ExecuteWorker() {
    while (true) {
        _pauseEvent.WaitOne(Timeout.Infinite);

        //This kills our process
        if (_shutdownEvent.WaitOne(0)) {
           break;
        }

        if (!_worker.IsReadyToExecute) {
            //sleep 5 seconds before checking again. If we go any longer we keep our service from shutting down when it needs to.
            Thread.Sleep(5000);
            continue;
        }
        DoWork();

    }
}

Mein problem ist hier,

_backGroundWorkerThread.Join();

Dieser wartet, bis der Thread.Schlafen in der ExecuteWorker() ausgeführt wird, in meinem hintergrund-thread.

Gibt es irgendeinen bestimmten Grund, warum Sie nicht mit einem Timer? Sie können diesen code minus die Schleife in einer Methode auf und übergeben Ihr als callback für einen Timer, der ausgeführt wird, alle n Minuten, dann stoppen die Aufgabe, töten Sie einfach den Timer oder Intervall auf Unendlich.
Ich habe mehr von dem code. Die Klasse dieser code ist ein Kind von einem Elternteil der Klasse, die es schafft eine unendliche Anzahl von diesen. Der übergeordneten Steuerung Starten, Beenden, Anhalten und fortsetzen der diese Kind-Klassen und die Arbeit, die Sie tun. Es ist nicht eine einfache Sache zu Starten und zu Stoppen, die unterstützt werden muss.
was ist _worker hier?
Nur eine Instanz einer Klasse, die scheduling-Logik. Es ist die Methode, IsReadyToExecute gibt einen booleschen Wert zurück. Die _worker ist nicht relevant zu dieser Frage.

InformationsquelleAutor Jeff Reddy | 2011-09-16

Schreibe einen Kommentar