Что произойдет, если вы запустите фоновый поток для выполнения непосредственно перед тем, как ASP.NET завершит обработку страницы? - PullRequest
5 голосов
/ 02 февраля 2009

что произойдет, если я раскручиваю поток для выполнения длительного процесса прямо перед завершением жизненного цикла страницы ASP.NET? Будет ли среда выполнения ASP.NET уничтожать поток? Может ли это привести к неопределенному поведению?

Вот пример кода, который раскручивает фоновый поток в событии Page_Load. Это безопасная вещь?

protected void Page_Load(object sender, EventArgs e)
{
    Thread newThread = new Thread(new ThreadStart(SomeLongRunningMethod));
    newThread.IsBackground = true;
    newThread.Start();
}

private void SomeLongRunningMethod()
{
    // some long running process goes here...
}

Ответы [ 4 ]

1 голос
/ 02 февраля 2009

Недавно коллега сделал это для экспорта некоторых данных. Клиент будет входить в панель управления (веб-интерфейс), а затем нажимать некоторые кнопки, а что нет, а затем файл будет передаваться по FTP на какой-то мистический сервер.

Внешний интерфейс был сделан с использованием ASP AJAX, и, как говорит @bang, поток работает хорошо, но следить за ним абсолютно просто.

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

Это все еще работает? Экспорт закончен? Что произойдет, если я обновлю страницу и снова нажму кнопку? Разве дом исполнителей отправит людям два продукта?

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

Если это кажется немного странным, вы всегда можете написать свой длительный процесс с помощью сервера сокетов , и ваш код aspx будет работать с ним.

1 голос
/ 02 февраля 2009

Я выполнил сом конвертирование / обработку сома с помощью ffmpeg для фильмов, загруженных пользователями в веб-форму, и это работало отлично, даже если поток занял несколько часов! Очень важно помнить, что трудно определить состояние потока, поэтому крайне важно вести журнал и обрабатывать ошибки.

1 голос
/ 02 февраля 2009

Я провел некоторые эксперименты с тем же типом кода, занимая некоторое время записи в отдельный поток. Кажется, это работает хорошо, но я не проверял его в производственной среде.

Единственное различие между вашим кодом и моим заключается в том, что я использовал пул потоков вместо создания нового потока.

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

0 голосов
/ 02 февраля 2009

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

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