Фоновые темы - плохая идея? Зачем? - PullRequest
7 голосов
/ 20 мая 2010

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

У меня есть веб-страница, которая импортирует файл CSV с номерами документов для выполнения дорогостоящей операции. Я поместил дорогую операцию в фоновый поток, чтобы предотвратить блокирование приложения. Вот что у меня в двух словах.

protected void ButtonUpload_Click(object sender, EventArgs e)
{
    if (FileUploadCSV.HasFile)
    {
        string fileText;
        using (var sr = new StreamReader(FileUploadCSV.FileContent))
        {
            fileText = sr.ReadToEnd();
        }

        var documentNumbers = fileText.Split(new[] {',', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries);

        ThreadStart threadStart = () => AnotherClass.ExpensiveOperation(documentNumbers);
        var thread = new Thread(threadStart) {IsBackground = true};
        thread.Start();
    }
}

(очевидно, с некоторой проверкой ошибок и сообщениями для пользователей)

Итак, мой тройной вопрос:

  • а) Это плохая идея?
  • б) Почему это плохая идея?
  • в) Что бы вы делали вместо этого?

Ответы [ 3 ]

8 голосов
/ 20 мая 2010

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

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

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

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

7 голосов
/ 20 мая 2010

Я рекомендую использовать класс BackgroundWorker вместо непосредственного использования потоков. Это связано с тем, что BackgroundWorker специально разработан для выполнения фоновых операций для графического приложения и (среди прочего) предоставляет механизмы для передачи обновлений в пользовательский интерфейс.

1 голос
/ 20 мая 2010

а: да.

Использовать ThreadPool;) Поставить в очередь WorkItem - избежать накладных расходов на генерацию тонн потоков.

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