ASP.NET выполняет длительный метод в фоновом режиме - PullRequest
1 голос
/ 26 июля 2011

То, что я пытаюсь выполнить: я хочу вызвать долго работающий метод бизнес-логики из кода за страницей asp.net (по нажатию кнопки от пользователя) и запустить процесс асинхронно. Процесс имеет несколько бизнес-объектов в качестве параметров. Как только процесс запускается, пользователю должен отображаться экран, показывающий, что ему будут отправлены результаты; важно то, что пользователю не нужно ждать завершения процесса. Каков наилучший способ сделать это? Процесс уже существует и работает в моем проекте, но страница просто зависает во время работы.

Изначально я думал о переносе метода на веб-сервис. Поскольку это потребовало бы обширного списка параметров, я собирался сохранить сигнатуру и передать бизнес-объекты веб-службы, но я получаю ошибки пространства имен. В частности, «Тип аргумента MyBusinessLogic.MyObject не может быть назначен типу параметра MyWebService.MyObject», хотя мой веб-сайт и веб-служба ссылаются на одну и ту же DLL. Я понимаю, почему это происходит, но мне нужно обойти это.

Реальная реализация решения не очень критична. Было бы замечательно, если бы был какой-то способ асинхронно выполнять вызов метода в ASP.NET, о котором я не знаю. Если нет, отправка и список параметров XML и синтаксический анализ его в бизнес-объектах мой единственный вариант для веб-службы?

Ответы [ 3 ]

1 голос
/ 26 июля 2011

Убедитесь, что вы используете страницы Async ASP.net.

http://blogs.msdn.com/b/tmarq/archive/2010/04/14/performing-asynchronous-work-or-tasks-in-asp-net-applications.aspx

1 голос
/ 28 июля 2011

Я почти уверен, что то, что я закончил, близко к методу Джереми.

Я нашел этот сайт: http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx, который объясняет, как вызывать метод асинхронно. Подводя итог: если вы определите прокси-сервер и вызовете ProxyMethod.BeginInvoke (null, null), то метод будет запущен без обратного вызова, то есть сработает и забудется. Это было все, что я действительно хотел, так что это то, с чем я собираюсь. Я не знаю, было ли это необходимо, но я взял сам метод, переместил его из своего кода в бизнес-логику и сделал его статическим методом. Так по коду выглядит так:

private delegate void AsyncReportGen(ReportParameterObject rpo);
protected void GenerateReport()
{
    //other code
    AsyncReportGen reportGen = ReportGenClass.GenerateReportStaticMethod;
    reportGen.BeginInvoke(rdo, null, null);
}

Метод GenerateReport вызывается событием нажатия кнопки. GenerateReportStaticMethod запускает электронное письмо с приложенным отчетом, когда он завершен. Метод, вызываемый BeginInvoke, запускается в своем собственном потоке, поэтому страница может завершить загрузку и показать пользователю сообщение о том, что он получит электронное письмо. Затем пользователь может продолжить использование сайта или закрыть свой браузер.

1 голос
/ 26 июля 2011

У меня та же проблема, поэтому я переместил вызов обработки в метод Pre_Render и, пока он обрабатывает, вызывает (создает) функцию js во внешнем интерфейсе для обновления прогресса.

Response.Write("fnUpdate('Processing 1 to 30 files')");
Response.Flush();

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

Надеюсь, это поможет.

EDIT: Не забудьте увеличить Script.Timeout

Server.ScriptTimeout = 3600;
...