Существует ли способ разбудить поток сна?

Существует ли способ разбудить поток сна в C#? Так, это имеет сон для любого долгое время и будит его, когда Вы хотите обработанную работу?

13
задан spig 11 August 2010 в 16:09
поделиться

4 ответа

Объект 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();
16
ответ дан 1 December 2019 в 21:36
поделиться

Если ваш поток находится внутри вызова Sleep , то (обычно) способа разбудить это вверх.(Единственное исключение, о котором я знаю, - это Java, которая позволяет досрочно завершать спящий режим, если какой-либо другой поток вызывает thread.interrupt () .)

Кажется, что шаблон, о котором вы говорите, для вызова события: поток содержит цикл, в верхней части которого он ожидает срабатывания события. Если событие в настоящее время не установлено, то поток «спит» до тех пор, пока какой-либо другой поток не запустит событие. В этот момент спящий поток просыпается и продолжает свою работу до следующего прохождения цикла, когда он засыпает для ожидания другого события.

5
ответ дан 1 December 2019 в 21:36
поделиться

Лучшим решением было бы использовать объекты Task со значением по умолчанию TaskFactory . Этот API (представленный в .NET 4.0) использует пул потоков с очередями для перехвата работы и всем прочим.

Если .NET 4.0 недоступен, используйте ThreadPool , который имеет встроенную рабочую очередь (которая выполняет некоторую балансировку пула, но не в той же области, что и пул потоков 4.0).

Если вы действительно должны сделать это самостоятельно, то я рекомендую BlockingCollection , которая представляет собой блокирующую очередь потребителя / производителя, добавленную в .NET 4.0.

Если вы действительно должны сделать это самостоятельно , а не можете использовать .NET 4.0, вы можете использовать ManualResetEvent или AutoResetEvent ] вместе с очередью работы, защищенной блокировкой .

1
ответ дан 1 December 2019 в 21:36
поделиться

Поможет ли эта ветка? C # имеет хорошую функциональность для обработки событий потока. Я сделал большую часть своей работы на Python, но в C #, похоже, есть надежные библиотеки для блокировки потоков.

0
ответ дан 1 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: