Interrompre un Thread en sommeil

Est-il possible d'Interrompre un thread en sommeil? Si j'ai un code similaire à cela.

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

}

Je suis désireux d'exécuter DoWork() toutes les heures. Donc, j'aimerais dormir un peu plus longtemps que 10 secondes. Dire vérifier toutes les 10 minutes. Cependant, si la valeur de mon sommeil à 10 minutes, et j'ai envie de tuer cette tâche en arrière-plan, je dois attendre pour le sommeil pour reprendre.

Mon code est à l'aide d'un Filetage.ManualResetEvent pour arrêter le travail de fond, mais mon problème est avec le ThreadSleep code. Je peux poster plus de code si nécessaire.

OK, je vais ajouter un peu plus de code complet ici car je pense que cela va répondre à certaines questions.

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

    }
}

Mon problème est ici,

_backGroundWorkerThread.Join();

Ce attend pour le Thread.Dormir dans le ExecuteWorker() qui est en cours d'exécution dans mon thread d'arrière-plan.

Est-il une raison précise pour laquelle vous n'êtes pas à l'aide d'une Minuterie? Vous pouvez placer ce code moins la boucle dans une méthode et de le passer comme le rappel pour une Minuterie qui exécute toutes les n minutes, puis à arrêter la tâche il suffit de tuer le Minuteur ou de définir sa intervalle à l'Infini.
J'ai posté plus de code. La classe de ce code est un enfant d'un parent de la classe qui gère un nombre infini de ces. Les contrôles parent le Démarrage, l'Arrêt, la Suspension et la reprise de ces classes enfant et le travail qu'ils font. Ce n'est pas une simple question de Start et de Stop qui doit être pris en charge.
qu'est-ce que _worker ici?
Juste une instance d'une classe qui a la planification de la logique. C'est la méthode, IsReadyToExecute renvoie une valeur booléenne. Le _worker n'est pas germane à cette question.

OriginalL'auteur Jeff Reddy | 2011-09-16