Как продолжить работу на сервере после возврата ответа с ASP.NET? (Веб-формы и MVC) - PullRequest
9 голосов
/ 02 декабря 2008


У меня есть приложение, в котором пользователь должен загрузить фотографию. После загрузки фотографии на сервер, которая не должна занимать много времени, пользователь должен получить ответ, который является обычной HTML-страницей с надписью "спасибо ... бла бла бла ..." Теперь, после того, как ответ отправлен клиенту, и он продолжает свой веселый путь, я хочу, чтобы сервер продолжил работу над этой фотографией. Это должно сделать что-то тяжелое и займет много времени. Но это нормально, потому что пользователь ничего не ждет. Он, вероятно, на другой странице.
Итак, мой вопрос, как мне сделать это с ASP.NET. Приложение, которое я пишу, находится в ASP.NET MVC, поэтому я представляю что-то вроде

//save the photo on the server
//and send viewdata saying "thanks..."
return View();
//keep doing heavy processing on the photo

Но я думаю, это не совсем так. Кроме того, поскольку иногда я работаю с ASP.NET WebForms, как это можно сделать и с WebForms.
Спасибо!

Ответы [ 6 ]

6 голосов
/ 02 декабря 2008

Мы делаем это для упрощенной регистрации:

Action<object> d = delegate(object val)
{
    // in this anonymous delegate, write code that you want to run
    ProcessDataAndLog();
};

d.BeginInvoke(null, null, null); // this spins off the method asynchronously.

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

EDIT:

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

System.Threading.ThreadPool.QueueUserWorkItem(
    delegate(object state)
    {
        // in this anonymous delegate, write code that you want to run
        ProcessDataAndLog();
    });

Дополнительная литература: Пул потоков и асинхронные методы и Асинхронный делегат против пула потоков & thread и Не вызывает EndInvoke В действительности вызывает память утечка?

1 голос
/ 02 декабря 2008

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

1 голос
/ 02 декабря 2008

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

0 голосов
/ 03 декабря 2008

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

//save the photo on the server
//Add referance in queue (possibly in database to http post that the windows service monitors with details of path to the file, output path, transformation etc.)
//and send viewdata saying "thanks..."
return View();

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

Колин Г

0 голосов
/ 02 декабря 2008

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

0 голосов
/ 02 декабря 2008

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

Посмотрите, сможете ли вы найти что-то, если вы ищете "Начальная тема ASP.NET"

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