Прежде чем люди предложат это: Я не использую Thread.sleep для ничего , за исключением попыток найти способ обойти это. Я пытаюсь обработать будущий код других людей, который не может быть свободным .Sleep (). Я очень хорошо понимаю, как ужасно синхронизировать вещи.
Я принимаю ветку в моем коде. Я хотел бы иметь возможность установить ограничение на время жизни этой темы. Мой обычный способ сделать это выглядит так:
Thread outer = new Thread(() =>
{
externalThread.Start();
externalThread.Join();
});
outer.Start();
outer.Join(lifetime);
if (outer.ThreadState != ThreadState.Stopped)
{
outer.Abort();
}
inner.Join();
С тех пор я обнаружил, что, очевидно, я не могу разбудить спящую нить до того, как сон закончится. Что еще хуже, это все равно пишет в консоль, если я дам ей время жизни 10 миллисекунд:
new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })
Хотя я понимаю, что .Abort () не является жестким ограничением на выполнение потоков. Кажется, 2 секунды было бы достаточно для предупреждения, но я думаю, что нет ...
Я пытался проверить состояние WaitSleepJoin и .Interrupt (); он прерывает поток или выдает исключение (извините, не уверен, что. Windows сообщает мне, что произошел сбой, если не запущен отладчик, и если он работает, как будто прерывание не было вызвано), и все еще записывает в консоль через 2 секунды , .Resume (), по-видимому, ничего не делает со спящим потоком.
Есть ли способ разбудить поток, не дожидаясь истечения его сна? Я понимаю, что остановка не является «немедленной», так что Console.WriteLine можно вызывать независимо; это 2 секундное ожидание, которое меня беспокоит. Что если это 10-дневное ожидание? Поскольку я не могу контролировать потоки, которые входят, у меня нет возможности узнать, и кажется, что предотвращение такой вещи не представляется возможным ...