Функция асинхронного обновления страниц в ASP.NET 2.0 действительно замечательна. Сегодня я пытался использовать ее для решения проблемы моего приложения, и это действительно очень помогло.
Моей странице необходимо отправить запрос в службу сокетов в фоновом режиме. Во-первых, это операция, которая может не возвращаться в течение длительного времени. Во-вторых, чтобы получить переменную длину и, возможно, большие данные ответа, возвращаемые сокетом. service, мне нужно использовать метод dotNET. IAsyncResult BeginReceive(byte[], int offset, int size, SocketFlags socketFlags, обратный вызов AsyncCallback, состояние объекта); чтобы асинхронно отправить команду сокета, а затем итеративно вызвать int EndReceive(IAsyncResult asyncResult) ; в функции обратного вызова для получения данных ответа. Пока данные не будут извлечены, эта серия фрагментов данных кэшируется в связанном списке MemoryBlock.
В этом случае, если страница ASP.NET хочет отображать данные ответа в таблице, ее необходимо обновить асинхронно.
ASP.NET 1.x по своей сути не поддерживает асинхронные страницы, но благодаря настойчивости и инновациям асинхронные страницы можно создавать. Дополнительную обзорную информацию см. в статье Фрица Ониона «Используйте потоки и создавайте асинхронные обработчики в серверном веб-коде» журнала MSDN® Magazine за июнь 2003 г.
Но ASP.NET 2.0 значительно упрощает создание асинхронных страниц. Сначала используйте директиву @ Page страницы, чтобы ввести атрибут Async="true".
Во-вторых, при Page_Load зарегистрируйте событие Page_PreRender:
Private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// Выполните метод, когда событие регистрации Page_PreRender завершится
// Перехватываем событие PreRenderComplete для привязки данных
этого .PreRenderComplete += новый EventHandler(Page_PreRenderComplete);
Далее я начал свой путь асинхронной работы с функцией события нажатия кнопки:
/// Метод PageAsyncTask — это расширенная версия. В дополнение к самим методам начала и завершения асинхронной обработки страницы,
/// также может предоставлять тайм-аут Метод обработки. ситуации и объекта состояния при обработке.
///
Задача PageAsyncTask = new PageAsyncTask(
new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
новый EndEventHandler(EndSubmitKeywordsAsyncOperation),
новый EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),
null
)
;
/// Для большинства простых ситуаций асинхронной обработки вы можете напрямую вызвать метод AddOnPreRenderCompleteAsync,
/// Отправьте код обработки в начале и конце запроса страницы
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// новый EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
Страница проходит свой обычный жизненный цикл обработки до момента возникновения события PreRender. Затем ASP.NET вызывает метод Begin BeginSubmitKeywordsAsyncOperation, зарегистрированный с помощью RegisterAsyncTask. В этом методе я передам свою команду службе sokcet, а затем верну объект IasyncResult, полученный методом сокета.BeginReceive, в ASP.NET.
Затем, после того как моя асинхронная функция обратного вызова сокета наконец получит все потоки данных,
она уведомляет страницу о том, что сокет завершил работу
, вызываяcallback.Invoke(result);.
Итак, ASP.NET вызывает метод EndSubmitKeywordsAsyncOperation:
///
/// Метод приема после завершения асинхронного вызова (после завершения асинхронной операции из пула потоков будет взят поток для обслуживания запроса страницы). ).
///
///
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
После этого ASP.NET снова вызывает событие Page_PreRender, чтобы в этом событии таблица на странице могла быть правильно заполнена.
Таким образом, моя цель была достигнута. Более того, если время ожидания повторной активации после отправки в фоновый режим истекло,
для соответствующей обработки можно также использовать
void TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)
.
Справочные ресурсы:
1.
Асинхронные страницы в ASP.NET 2.0
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true
http://www.cnblogs com. /zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html