Interrompa um tópico adormecido
Existe uma maneira de interromper um fio adormecido? Se eu tiver um código semelhante a est
while(true){
if(DateTime.Now.Subtract(_lastExecuteTime).TotalHours > 1){
DoWork();
_lastExecuteTime = DateTime.Now();
continue;
}
Thread.Sleep(10000) //Sleep 10 seconds
if(somethingIndicatingQuit){
break;
}
}
Estou querendo executar o DoWork () a cada hora. Então, eu gostaria de dormir um pouco mais de 10 segundos. Diga cheque a cada 10 minutos ou mais. No entanto, se definir meu sono para 10 minutos e eu desejar interromper essa tarefa em segundo plano, tenho que aguardar o retorno do sono.
Meu código real está usando um Threading.ManualResetEvent para encerrar o trabalho em segundo plano, mas meu problema é com o código ThreadSleep. Posso postar mais código, se necessári
OK, vou adicionar um código um pouco mais completo aqui, pois acho que ele responderá a algumas das pergunta
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();
}
}
Meu problema está aqui,
_backGroundWorkerThread.Join();
Este aguarda o Thread.Sleep no ExecuteWorker () que está sendo executado no meu thread de segundo plan