![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Warchief |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 24.5.2007 Репутация: нет Всего: 3 |
Добрый день!
помогите разобраться с потоками. есть приложение, в котором при нажатии на баттон, стартует поток:
Поток удачно стартует и работает. В теле функции MakeWork() есть следующий код,
который усыпляет поток. В приложении есть кнопка, которая должна прерывать поток, пытаюсь делать так:
Проблема в том, что поток не завершается, пока он находится в состоянии Sleep. И завершается только лишь после того, как поток пробудился. Такая-же проблема при закрытии приложения нажатием на "крестик в верху окна". t.interrupt(), помогает, НО при закрытии приложения(когда Thread.Sleep(int.Parse(textGetWaiter.Text)); ещё не отработал) во время выполнения потока t, приложение пытается прочитать значение Thread.Sleep(int.Parse(textGetWaiter.Text)); и естественно не найдя его на форме, валится с ошибкой. |
||||||
|
|||||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
есть Abort. по идее сгенерирует ThreadAbortException при достижении первой IL инструкции.... этот Exception делает rethrow в блоке catch, если не изменить явным образом то поведение. Однако этот Exception не является аварийным событием, так что сама программа не завершается
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
посмотри в сторону EventWaitHandle
усыплять поток можно через
при выходе из приложения нужно будет послать сигнал и вызвать thread.Join(), что разбудит поток и дождётся его корректного завершения |
|||
|
||||
| Warchief |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 24.5.2007 Репутация: нет Всего: 3 |
спасибо за ответы, но мне не важно чтобы поток завершался корректно, мне нужно его максимально быстро завершить. Т.к. поток в основном спит по 30 секунд.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Warchief, вызывай вместо Sleep WaitOne c таймаутом 30 секунд.
|
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
||||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
можешь ещё обратить внимание на свойство Thread.IsBackground |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
mihryak, а зачем в этом варианте Abort? достаточно if (resetEvent.WaitOne(...)) return;
|
|||
|
||||
| mihryak |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
это на тот случай, если
уже прошёл, пошла остальная работа, и её надо тоже остановить но проверка результата WaitOne и досрочный неаварийный выход - стоящая штука, не подумал как-то _____________ ещё раз напомню про IsBackground если не требуется особенная обработка завершения потока, то это свойство - самое то, что нужно, рантайм сам всё грамотно прибьёт Это сообщение отредактировал(а) mihryak - 19.12.2008, 01:49 |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |