Завершение многопоточного приложения
От: Аноним  
Дата: 07.11.07 09:04
Оценка:
Приложение работает в несколько потоков. Если пользователь желает завершить приложение, закрывая основную форму, то остальные потоки нельзя рубить по Thread.Abort так как это приводит к ошибкам API и повреждению данных. Соответственно сделал в классах тех потоков свойство Stop, которое можно выставить в false и соответственно произойдет корректное завершение работы. Выглядит это примерно так:
class ShowOnMap{
  ...
  private bool stop = false;
  object thisLock = new object();
  public bool Stop {
    get{return stop;}
    set{lock(thisLock){stop = value;}}
  }
  ...
  public void Show()
  {
    ...
    while(... && !stop){
      ...
      lock(thisLock){
        ...
      }
      ...
    }
  }
}

Обработчик закрытия формы (а это означает, что пользователь хочет завершить приложение) выглядит примерно так:
if (thrShowOnMap != null){ // Проверка, что поток работающий с классом ShowOnMap существует
  showOnMap.Stop = true; // Сигнализация о необходимости завершить работу объекту класса ShowOnMap 
  thrShowOnMap.About(); // Попытка прерывание поток (должно произойти после корректного прекращения работы объекта класса ShowOnMap
  Thread.Sleep(1000); // Ожидание, для корректного завершения потока
}

Все это дело достаточно успешно работало, но поскольку потоков было несколько, то для каждого в закрытии формы был прописан соответствующий код завершения (там разные классы в разных потоках работают). И время закрытия формы было никак не меньше чем количество потоков помноженное на одну секунду (Thread.Sleep(1000). Рассудив, что это неправильно — пользователь жмет заркрыть форму, а она продолжает висеть на экране и ни на что не реагировать в течении нескольких секунд, я вынес процесс прекращения обработки данных и остановки потоков в отдельный поток, специально созданный для этой цели. Форма же закрывалась сразу. Таким образом, после закрытия формы, приложение на самом деле еще работает несколько секунд и при желании пользователь может его наблюдать в списке процессов. Меня это не смущает. Однако хочу знать, что остальные разработчики думают о таком подходе?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.