Приложение работает в несколько потоков. Если пользователь желает завершить приложение, закрывая основную форму, то остальные потоки нельзя рубить по 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)

. Рассудив, что это неправильно — пользователь жмет заркрыть форму, а она продолжает висеть на экране и ни на что не реагировать в течении нескольких секунд, я вынес процесс прекращения обработки данных и остановки потоков в отдельный поток, специально созданный для этой цели. Форма же закрывалась сразу. Таким образом, после закрытия формы, приложение на самом деле еще работает несколько секунд и при желании пользователь может его наблюдать в списке процессов. Меня это не смущает. Однако хочу знать, что остальные разработчики думают о таком подходе?