Существует ли способ разбудить поток сна в C#? Так, это имеет сон для любого долгое время и будит его, когда Вы хотите обработанную работу?
Объект AutoResetEvent
(или другая реализация WaitHandle
) может использоваться для перехода в спящий режим, пока не будет получен сигнал от другого потока:
// launch a calculation thread
var waitHandle = new AutoResetEvent(false);
int result;
var calculationThread = new Thread(
delegate
{
// this code will run on the calculation thread
result = FactorSomeLargeNumber();
waitHandle.Set();
});
calculationThread.Start();
// now that the other thread is launched, we can do something else.
DoOtherStuff();
// we've run out of other stuff to do, so sleep until calculation thread finishes
waitHandle.WaitOne();
Если ваш поток находится внутри вызова Sleep
, то (обычно) способа разбудить это вверх.(Единственное исключение, о котором я знаю, - это Java, которая позволяет досрочно завершать спящий режим, если какой-либо другой поток вызывает thread.interrupt ()
.)
Кажется, что шаблон, о котором вы говорите, для вызова события: поток содержит цикл, в верхней части которого он ожидает срабатывания события. Если событие в настоящее время не установлено, то поток «спит» до тех пор, пока какой-либо другой поток не запустит событие. В этот момент спящий поток просыпается и продолжает свою работу до следующего прохождения цикла, когда он засыпает для ожидания другого события.
Лучшим решением было бы использовать объекты Task
со значением по умолчанию TaskFactory
. Этот API (представленный в .NET 4.0) использует пул потоков с очередями для перехвата работы и всем прочим.
Если .NET 4.0 недоступен, используйте ThreadPool
, который имеет встроенную рабочую очередь (которая выполняет некоторую балансировку пула, но не в той же области, что и пул потоков 4.0).
Если вы действительно должны сделать это самостоятельно, то я рекомендую BlockingCollection
, которая представляет собой блокирующую очередь потребителя / производителя, добавленную в .NET 4.0.
Если вы действительно должны сделать это самостоятельно , а не можете использовать .NET 4.0, вы можете использовать ManualResetEvent
или AutoResetEvent
] вместе с очередью работы, защищенной блокировкой
.
Поможет ли эта ветка? C # имеет хорошую функциональность для обработки событий потока. Я сделал большую часть своей работы на Python, но в C #, похоже, есть надежные библиотеки для блокировки потоков.