Временная остановка потока C # - PullRequest
2 голосов
/ 02 февраля 2010

Мне нужно добавить тайм-аут в длительный поток.У нас есть некоторые внешние проблемы, которые иногда могут привести к зависанию этого потока на определенной строке кода на неопределенный срок.Чтобы сделать наш процесс более устойчивым, мы хотим обнаружить, что поток больше не работает / опрашивать, и прервать поток.Это позволит нам очистить ресурсы и перезапустить поток.

Какой метод добавления этой функции предпочтительнее?

Ответы [ 3 ]

6 голосов
/ 02 февраля 2010

Предпочтительным методом является запуск ненадежной подсистемы в своем собственном процессе , а не в собственной потоке .Таким образом, когда он ведет себя плохо, вы можете уничтожить весь процесс и заставить операционную систему убрать весь оставшийся после этого ужасный беспорядок.Уничтожение потока, на котором выполняется ненадежный код в вашем процессе, может иметь всевозможные неприятные побочные эффекты для вашего кода, поскольку операционная система не может узнать, какие ресурсы принадлежат потоку с плохим поведением, а какие еще используются.

Короче говоря: не делитесь процессом с кодом, который вы не можете контролировать.

2 голосов
/ 02 февраля 2010

Вам нужно две вещи:

  1. Какой-то другой поток, который может выполнять мониторинг и прерывание (ваш поток "monitor")
  2. Какой-то механизм проверки работоспособности подозрительного потока

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

//suspect thread
foreach(var thing in whatever)
{
    //do some stuff
    SomeClass.StaticVariable = DateTime.Now;
}

//monitor thread
while(shouldStillBeWorking)
{
    Thread.Sleep(TimeSpan.FromMinutes(10));
    if (DateTime.Now.Subtract(TimeSpan.FromMinutes(15) < SomeClass.StaticVariable)
        suspectThread.Abort()
}
0 голосов
/ 04 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...