Как отправить уведомление в браузер из ветки в .Net? - PullRequest
0 голосов
/ 13 января 2012

На данный момент у моего проекта есть метод

do_quote(quoteid,userid)

Этот метод занимает минуту или две, а затем перенаправляет на другую страницу.

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

В событии button_click на странице default.aspx:

Dim d as New do_quote_delegate(AddressOf do_quote)
d.BeginInvoke(quoteid,userid, New AsyncCallback(AddressOf Callback),d)
Response.redirect("results.aspx")

Что относится к

Delegate Sub do_quote_delegate(Byval quoteid as integer, Byval userid as integer)

Public Sub do_quote(Byval quoteid as integer, Byval userid as integer)
     ' Do something for several seconds
End Sub

Public Sub Callback(Byval ar As IAsyncResult)
    ar.AsyncState.EndInvoke(ar)
    ' i think i need something here to trigger a notification
End Sub

Это в основном то, что я хочу, пользователь может выполнять действия на сайте, а метод do_quote работает в фоновом режиме и успешно выполняет свои задачи.

Я хотел бы отправить уведомление в браузер, когда do_quote завершится. В идеале я хотел бы изменить текст div на главной странице (но для этого просто нужно вернуть сообщение ALERT javascript msgbox).

Насколько я понимаю, Callback вызывается в конце процесса, поэтому я думаю, что это было бы идеальным местом для отправки javascript в браузер, но я не могу думать, как я мог бы реализовать это. Кто-нибудь есть какие-либо идеи о том, как я мог бы реализовать очень простое уведомление (msgbox, response.write и т. Д.) Для браузера, когда метод обратного вызова вызывается в конце процесса? Спасибо

1 Ответ

1 голос
/ 13 января 2012

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

Общая схема того, какмы обрабатываем долгосрочные транзакции следующим образом:

Инициировать процесс на веб-сервере с помощью обратной передачи или запроса ajax.

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

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

После запуска процесса веб-сервер возвращает уникальный идентификатор браузеру.

Затем браузер устанавливает цикл window.timeoutрегулярно проверять состояние запроса с помощью ajax-вызова или PageMethod.

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

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

У нас естьуспешно использовал этот шаблон для нескольких длительных операций, включая создание отчетов и объединение данных.

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