Как обеспечить завершение фонового потока при завершении приложения?

У меня есть приложение asp.net с фоновым потоком. Поток запускается при запуске приложения и изящно останавливается при завершении приложения. Я запускаю веб-сайт на общем хосте. К сожалению, иногда приложение не вызывает событие Application_End при завершении. Я бы подумал, что потоки все равно будут убиты, но это не так. В настоящее время у меня есть 4 потока, работающих в фоновом режиме. Три из предыдущих запусков приложения и 1 из текущего сеанса приложения. Как я могу гарантировать, что потоки будут отключены, когда приложение завершит работу? Есть ли способ для потоков проверить, было ли приложение сброшено или было сброшено? Или есть способ проверить эти мошеннические потоки при запуске приложения и убить их? Заранее спасибо.


person sagescrub    schedule 12.08.2010    source источник
comment
как именно вы начинаете свою тему?   -  person Ilia G    schedule 12.08.2010
comment
Учитывая, что некоторые потоки из вашего приложения все еще выполняются, ясно, что приложение не завершилось в первую очередь, а только то, что вы считаете потоками «переднего плана». Если вы используете System.Threading.Threads для фоновых задач, вы можете установить для их свойств IsBackground значение true.   -  person Ani    schedule 12.08.2010
comment
Спасибо Ани, я не знал об этом свойстве, и я думаю, что это решит проблему.   -  person sagescrub    schedule 13.08.2010


Ответы (1)


Используйте ThreadPool.QueueUserWorkItem() для выполнения кода в фоновом режиме, который завершится при выгрузке AppDomain. Я предполагаю, что вы используете фоновую работу, в соответствии с тегами, и я бы предложил попробовать это вместо этого. (Рассмотрите возможность добавления примера кода, чтобы получить более точные ответы.)

Управляемый пул потоков: http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

Передние/фоновые потоки: http://msdn.microsoft.com/en-us/library/h339syd0.aspx

person umbyersw    schedule 12.08.2010
comment
Спасибо за эту информацию, я не знал об управляемом пуле потоков. Из примеров, которые вы мне показали, похоже, что он работает для запуска потока в функции того же класса. Но я использую отдельный созданный класс в качестве потока. Будет ли он работать и в этом случае? Каков компромисс между использованием Managed ThreadPool и установкой для свойства IsBackground значения true, как упоминала Ани выше? - person sagescrub; 13.08.2010
comment
Кроме того, в предоставленной вами ссылке указано, что если у вас есть короткие задачи, требующие фоновой обработки, управляемый пул потоков — это простой способ воспользоваться преимуществами нескольких потоков. Боюсь, это не так, так как моя ветка будет жить на протяжении всей жизни приложения. - person sagescrub; 13.08.2010