Я работаю над проектом, который должен блокировать текущую нить для промежутка времени, который может варьироваться от одной секунды до нескольких месяцев.Блокировка потока дольше, чем Int32.MaxValue
Подход, с которым я пришел, заключался в использовании метода EventWaitHandle.WaitOne
(или любого из его братьев и сестер) с указанным таймаутом. Проблема в том, что все эти методы принимают Int32 в качестве параметра, который перекрывает максимальное время блока примерно до 25 дней.
Кто-нибудь знает об этом? Как заблокировать поток дольше, чем миллисекунды Int32.MaxValue?
благодаря
UPDATE
Просто для записи, вот фрагмент кода я наконец придумал:
while(_doRun)
{
// Determine the next trigger time
var nextOccurence = DetermineNextOccurence();
var sleepSpan = nextOccurence - DateTime.Now;
// if the next occurence is more than Int32.MaxValue millisecs away,
// loop to work around the limitations of EventWaitHandle.WaitOne()
if (sleepSpan.TotalMilliseconds > Int32.MaxValue)
{
var idleTime = GetReasonableIdleWaitTimeSpan();
var iterationCount = Math.Truncate(sleepSpan.TotalMilliseconds/idleTime.TotalMilliseconds);
for (var i = 0; i < iterationCount; i++)
{
// Wait for the idle timespan (or until a Set() is called).
if(_ewh.WaitOne(idleTime)) { break; }
}
}
else
{
// if the next occurence is in the past, trigger right away
if (sleepSpan.TotalMilliseconds < 0) { sleepSpan = TimeSpan.FromMilliseconds(25); }
// Wait for the sleep span (or until a Set() is called).
if (!_ewh.WaitOne(sleepSpan))
{
// raise the trigger event
RaiseTriggerEvent();
}
}
}
Этот сниппет код выполняется с помощью специальной нити. Обратите внимание, что EventWaitHandle.Set()
вызывается только тогда, когда приложение завершает работу или отказывается отменить планировщик.
Спасибо тем, кто хочет помочь.
Вы действительно думаете, что ваше приложение может работать так долго? Это наверняка потерпит крах на 23-й день во время тестирования. –
Звучит для меня как-то ужасно неправильно с дизайном. – eurotrash
Вы должны начать свою тему на каком-то мероприятии. Или используйте таймер, который не будет потрачен впустую, чтобы принять поток. –