Как возобновить / прервать поток BackgroundWorker - PullRequest
1 голос
/ 24 июля 2011

В моей программе будет время, когда мне придется позвонить

Thread.Sleep(Timeout.Infinite);

для «временной приостановки» работы BackgroundWorker. Групповое поле будет отображаться до того, как поток фонового рабочего спит. В этом групповом блоке есть кнопка, которая должна «разбудить» поток фонового рабочего и продолжить его.

Если я вызываю Thread.Interrupt () (который, между прочим, я не могу использовать, пока не создаю объект Thread, чего я не должен делать) в событии button_Click, например:

private void button1_Click(object sender, EventArgs e)
    {
        Thread.Interrupt(); //interrupt thread
    }

Поток, который он "будет" прерывать, - это поток пользовательского интерфейса, я прав? Что мне нужно сделать, это прервать поток BackgroundWorker. Как мне это сделать?

РЕДАКТИРОВАТЬ: Спасибо за те, кто ответил на этот вопрос. Я буду использовать AutoResetEvent. Кажется более подходящим для моего использования.

Ответы [ 3 ]

3 голосов
/ 24 июля 2011

Позвольте мне начать с концепции высокого уровня:

Что вам нужно сделать, так это иметь токен, который вы будете часто проверять в коде, который выполняется BackgroundWorker. Когда токен установлен, ваш фоновый код будет останавливать нормальный поток и просто проверять токен время от времени, а когда токен будет очищен, фоновый код может продолжить обработку.

Итак, интересная часть выше - это токен. То, что я хотел бы сделать, это, возможно, иметь булево значение, которое я проверяю, и когда это логическое значение установлено на true, я блокирую поток, ожидая на ManualResetEvent Если вы хотите возобновить обработку, вы устанавливаете логическое значение false и используете метод Set() объекта ManualResetEvent, чтобы выпустить разрешение и продолжить код.

2 голосов
/ 24 июля 2011

Вы должны посмотреть на ManualResetEvent

Использование:

ManualResetEvent e = new ManualResetEvent(false);  //global variable
e.WaitOne(); // Thread will wait until event is triggered
e.Set(); // Trigger event from other thread
0 голосов
/ 24 июля 2011

Вы должны использовать семафор для синхронизации между потоками.

Как только вы хотите, чтобы фоновый работник "спал", возьмите дескриптор семафора, как только вы нажмете кнопку "пробуждения", отпустите семафор, и фоновый работник возобновит работу.

Из вашего потока графического интерфейса (тот, который показывает кнопку) вы должны объявить

Semaphore s = new Semaphore(0, 1);

в фоновом рабочем потоке - этот оператор инициализирует семафор со значением по умолчанию 0 (заблокировано)

на вашем фоновом рабочем потоке / вызове кода:

s.WaitOne();

это утверждение фактически заставляет фонового рабочего ждать, пока семафор не будет выпущен потоком графического интерфейса (кнопка пробуждения).

в обработчике нажатия кнопки, вызовите:

s.Release();

операция release позволяет фоновому рабочему коду возобновить работу.

...