Прежде чем люди предложат это: Я не использую 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 дней? Поскольку я не могу контролировать входящие потоки, я не могу знать, и, кажется, нет способа предотвратить подобное...