Бросать методы в Задачу, чтобы избежать блокировки потока asp.net - PullRequest
11 голосов
/ 02 мая 2011

Мне интересно, есть ли в следующем коде какие-либо ошибки, о которых я не знаю при работе на веб-сервере.Прочитав отличную серию http://reedcopsey.com/series/parallelism-in-net4/ Я не могу найти ничего, что относится конкретно к моему вопросу, так же как и к msdn, поэтому я решил привести его сюда.

Пример вызова:

public ActionResult Index() {
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    Task.Factory.StartNew(() => {
        //This is some long completing task that I don't care about
        //Say logging to the database or updating certain information
        System.Threading.Thread.Sleep(10000);
    });

    return View();
}

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

ASP.Net поддерживает асинхронные страницы, см. Асинхронные страницы в ASP.NET , но представляет собой сложную модель программирования и совсем не связывается с MVC.При этом запуск асинхронных задач из обработчика синхронных запросов работает до такой степени:

  • , если скорость, с которой запросы добавляют новые задачи, превышает среднюю скорость обработки, ваш процесс в конечном итоге завершится сбоем.Задачи занимают оперативную память, и в конечном итоге они будут заполнять очереди в памяти, где они хранятся, и вы начнете получать ошибки при отправке.
  • .Net Taks по своей сути ненадежны, так как им не хватает постоянного хранилища, поэтомувсе задачи, которые передаются в асинхронном режиме, должны быть обработаны как «неиспользуемые», т.е.если они никогда не завершатся, не будет потери ни для приложения, ни для пользователя, делающего запрос.Если задача важна, то она должна быть передана через надежный механизм, который гарантирует выполнение при наличии сбоев, например, представленный в Асинхронное выполнение процедуры .
4 голосов
/ 03 мая 2011

Одна важная вещь в этом случае - убедиться, что код, содержащийся внутри задачи, обернут в блок try / catch, или любые возможные исключения, выданные в этом потоке, будут распространяться.Вы также должны убедиться, что в этой длительной задаче у вас нет доступа ни к одному из элементов Http Context, таким как Request, Response, Session и т. Д., Так как они могут перестать быть доступными к моменту обращения к ним.

0 голосов
/ 09 ноября 2012

Используйте new Thread вместо Task.Factory.StartNew. Task.Factory.StartNew используйте поток из пула потоков, и если у вас будет много фоновых задач, в пуле потоков будут исчерпаны потоки, что приведет к ухудшению работы вашего веб-приложения. Запросы будут поставлены в очередь, и ваше веб-приложение в конечном итоге умрет :)

Вы можете проверить, выполняется ли ваша фоновая работа в Пуле потоков с помощью Thread.CurrentThread.IsThreadPoolThread. Если вы получаете True, тогда используется Thread Pool.

...