Лучший способ разбудить нить, чтобы бросить курить? C # - PullRequest
1 голос
/ 26 января 2010

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

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

Ответы [ 3 ]

3 голосов
/ 26 января 2010

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

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

2 голосов
/ 26 января 2010

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

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

Обновление

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

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

1 голос
/ 26 января 2010

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

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

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

...