Лучший способ разбудить поток, чтобы выйти? С#

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

Когда закрытие закрывает exe, я хотел бы разбудить поток и закрыть его, как лучше всего это сделать? Обратный вызов уже говорит, хочет ли пользователь выйти, поэтому теперь проблема заключается в использовании Thread.Sleep и его преждевременном пробуждении, чтобы он мог выйти, вместо того, чтобы процесс продолжался еще несколько секунд или минут. Эта функция была бы полезна для более быстрого выхода из остановки.


person Community    schedule 26.01.2010    source источник


Ответы (3)


Другой подход будет следующим:

Имейте ManualResetEvent в своей программе и вызывайте Set, когда вы хотите, чтобы поток завершился и закрылся. Вместо вызова Thread.Sleep в рабочем потоке вызовите event.WaitOne и передайте объект TimeSpan. Если о событии сигнализируется, ваш рабочий поток проснется до истечения времени ожидания — WaitOne вернет true.

person Dave Cluderay    schedule 26.01.2010
comment
Даже с этим решением я бы по-прежнему рекомендовал использовать BackgroundWorker. - person Mark Byers; 26.01.2010

Используйте BackgroundWorker или установите тег IsBackground в значение true, тогда ваше приложение открыто.

Я бы порекомендовал BackgroundWorker, но последний — быстрое решение.

Обновить

Оригинальный постер изменил свои требования после публикации вопроса (см. комментарии к этому вопросу). Обновление для ответа следует:

Если вы хотите остановить фоновую операцию, не закрывая приложение, см. CancelAsync. Кроме того, не используйте Thread.Sleep — используйте WaitHandle и вызовите WaitOne, что вам нужно дождаться.

person Mark Byers    schedule 26.01.2010
comment
Я посмотрю на него, как мне сказать ему проснуться ото сна? -edit- я думаю, я мог бы использовать его, чтобы не предотвращать завершение, но я хотел бы разбудить его, когда пользователь нажимает кнопку «Стоп». Думаю не буду заморачиваться? (Попытка убить нить кажется плохой) - person ; 26.01.2010
comment
Вам не нужно ничего делать с фоновым потоком. Если нет какой-либо конкретной очистки, которая требуется вашему потоку перед выходом приложения, вы можете просто закрыть приложение и позволить потоку умереть. Фоновые потоки не могут держать приложение открытым. - person Mark Byers; 26.01.2010
comment
Я больше беспокоился о том, чтобы позволить пользователю остановить его раньше и запустить другую команду, не дожидаясь моего комментария. - person ; 26.01.2010
comment
Я не понимаю ... если вас больше беспокоит остановка потока без закрытия приложения, почему вы не указали это в своем вопросе? Если вам нужно остановить поток в другое время, кроме завершения приложения, вам нужно использовать другое решение. Возможно, вам следует обновить свой вопрос, чтобы прояснить это, потому что ваш текущий вопрос не отражает ваших требований. - person Mark Byers; 26.01.2010

Я должен согласиться с Марком. Единственное, что ясно в вашем вопросе, это то, что вам нужно пересмотреть свою стратегию многопоточности. Вы говорите, что у вас есть работающий поток, но затем вы говорите, что хотите его разбудить?

Поток ждет работы? Если это так, спите более короткими циклами и чаще проверяйте выход или используйте событие сброса. Лучший способ разбудить поток — не усыплять его. Делайте то, что должны, и выходите. Всегда проверяйте наличие сигналов прерывания, в какой бы форме вы их ни реализовали, перед запуском каких-либо длительных операций, и опять же, если вам нужно приостановить поток, делайте это короткими циклами.

Поток занят, и вы хотите прервать его? У вас может не быть выбора, кроме как убить его, если вы не можете настроить его так, чтобы он мог своевременно реагировать на сигналы прерывания.

person Sky Sanders    schedule 26.01.2010