Преди хората да го предложат: Не използвам 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 дни? Тъй като не мога да контролирам нишките, които влизат, няма начин да знам и изглежда няма начин да предотвратя подобно нещо...