Прервать спящую нить
Есть ли способ прервать спящий поток? Если у меня есть код, похожий на этот.
while(true){
if(DateTime.Now.Subtract(_lastExecuteTime).TotalHours > 1){
DoWork();
_lastExecuteTime = DateTime.Now();
continue;
}
Thread.Sleep(10000) //Sleep 10 seconds
if(somethingIndicatingQuit){
break;
}
}
Я хочу выполнять DoWork () каждый час. Итак, я хотел бы поспать чуть дольше 10 секунд. Скажем, проверять каждые 10 минут или около того. Однако если установить сон на 10 минут и я хочу убить эту фоновую задачу, мне придется ждать возобновления сна.
Фактически мой код использует Threading.ManualResetEvent для завершения фоновой работы, но моя проблема связана с кодом ThreadSleep. Я могу опубликовать больше кода, если это необходимо.
Хорошо, я собираюсь добавить немного более полный код здесь, так как я думаю, что он ответит на некоторые вопросы.
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();
}
}
Моя проблема здесь,
_backGroundWorkerThread.Join();
Это ожидает Thread.Sleep в ExecuteWorker (), который работает в моем фоновом потоке.