контроллер, используемый для сохранения данных, мгновенного возврата view () и запуска кода в фоновом режиме - PullRequest
0 голосов
/ 25 августа 2010

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

Что я хочу сделать, это получить POST в контроллере и выделить фоновый поток, который будет выполнять реальную работу по сохранению данных; это позволило бы мне сделать return view () мгновенно. Так что, по сути, единственное отставание, которое потребуется, - это создание фонового потока, который должен составлять миллисекунды.

Я пытался сделать это, используя фоновый работник

public ActionResult Save(){
using (BackgroundWorker worker = new BackgroundWorker())
                    {
                        worker.DoWork += new DoWorkEventHandler(blah);
                        worker.RunWorkerAsync(Request.Form["data"]);
                    }
return View();
}

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

Любые идеи о том, как сделать это так, чтобы представление возвращалось мгновенно (в то время как фоновый работник обрабатывает данные в фоновом режиме, сколько бы времени это ни занимало)?

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Я бы предложил сбросить данные в базу данных или другое внешнее хранилище и использовать отдельный процесс для выполнения работы (возможно, Windows Service или инструмент планирования заданий, такой как Quartz.NET).

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

0 голосов
/ 25 августа 2010

Попробуйте вращать нить вручную, чтобы увидеть, имеет ли это какое-то значение:

public ActionResult Save()
{
    new Thread(blah).Start(Request.Form["data"]);
    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...