Прервать спящий потокC#

Место общения программистов C#
Ответить
Anonymous
 Прервать спящий поток

Сообщение Anonymous »

Есть ли способ прервать спящий поток? Если у меня есть код, подобный этому.

Код: Выделить всё

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(), который работает в моем фоновом потоке.

Подробнее здесь: https://stackoverflow.com/questions/744 ... ing-thread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»