Если вы хотите изучить технологию асинхронных страниц Asp.Net2.0, вам необходимо внимательно прочитать http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true и загрузить ее исходный код и изучите его внимательно. В полном тексте представлены три модели программирования для реализации асинхронных страниц, каждая из которых имеет более мощные функции, чем другая. Я не буду говорить много больше, давайте просто посмотрим на последнюю модель: используйте класс PageAsyncTask, метод RegisterAsyncTask, метод ExecuteRegisteredAsyncTasks и метод TimeoutAsyncOperation для регистрации и выполнения асинхронных задач, а также вызывайте метод обработки таймаута при длительных периодах отсутствия ответа. Файл AsyncPageTask.aspx.cs исходного кода, представленный в исходной статье, содержит подробный пример использования этой модели для реализации асинхронных страниц.
Самым большим преимуществом этой модели является то, что она может обрабатывать несколько асинхронных задач в одном запросе страницы, а также можно использовать обработку тайм-аута, чтобы избежать зависания при выполнении асинхронных операций. Первоначальный автор зарегистрировал только асинхронную задачу в Page_Load, поэтому мы следуем его примеру и регистрируем другую асинхронную задачу, как показано ниже:
<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Страница без названия" %>
protected void Page_Load (отправитель объекта, EventArgs e)
{
если (!IsPostBack)
{
Задача PageAsyncTask = новая PageAsyncTask(
новый BeginEventHandler(BeginAsyncOperation),
новый EndEventHandler(EndAsyncOperation),
новый EndEventHandler (TimeoutAsyncOperation),
нулевой
);
PageAsyncTask Task1 = новый PageAsyncTask(
новый BeginEventHandler(BeginAsyncOperation1),
новый EndEventHandler(EndAsyncOperation1),
новый EndEventHandler (TimeoutAsyncOperation1),
нулевой
);
RegisterAsyncTask (задача);
RegisterAsyncTask(задача1);
}
}
Если результат, возвращаемый асинхронной задачей, получен в течение времени, указанного в атрибуте страницы AsyncTimeout, страница будет отображаться так, как мы ожидали. Но что произойдет, если при выполнении первого задания у вас возникнут небольшие проблемы и вы потеряете время? Существует две возможности: во-первых, результат первой задачи наконец возвращается и отображается, а время ожидания второй задачи считается истекшим, как только она запускается, таким образом выполняется ее метод TimeoutAsyncOperation, во-вторых, первая задача этого не делает; была приговорена к таймауту к моменту возврата результата, поэтому вторая задача также должна была быть приговорена к таймауту. Вышеупомянутая ситуация связана с тем, что две асинхронные задачи разделяют время, указанное в AsyncTimeout. Пока выполнение предыдущей задачи задерживается, это неизбежно влияет на работу последующей задачи. Так могут ли две асинхронные задачи иметь эксклюзивный доступ к времени, указанному в AsyncTimeout? Для этого необходимо найти способ с помощью метода ExecuteRegisteredAsyncTasks?
Стоит отметить, что Asp.net2.0 будет сбрасывать свойство AsyncTimeout каждый раз, когда вызывается ExecuteRegisteredAsyncTasks, что означает, что можно выполнить асинхронную задачу исключительно в течение времени, указанного AsyncTimeout. Согласно текущему способу написания программы, если метод ExecuteRegisteredAsyncTasks не вызывается явно, Asp.net2.0 вызовет PreRenderComplete в жизненном цикле страницы.
Метод ExecuteRegisteredAsyncTasks автоматически вызывается перед событием для запуска двух зарегистрированных асинхронных задач. Поскольку ExecuteRegisteredAsyncTasks выполняется только один раз, но запускаются две задачи, эти две задачи должны совместно использовать время выполнения, указанное в AsyncTimeout. Поэтому я внес в код следующие изменения:
protected void Page_Load(object sender, EventArgs e)
{
если (!IsPostBack)
{
Задача PageAsyncTask = новая PageAsyncTask(
новый BeginEventHandler(BeginAsyncOperation),
новый EndEventHandler(EndAsyncOperation),
новый EndEventHandler (TimeoutAsyncOperation),
нулевой
);
PageAsyncTask Task1 = новый PageAsyncTask(
новый BeginEventHandler(BeginAsyncOperation1),
новый EndEventHandler(EndAsyncOperation1),
новый EndEventHandler (TimeoutAsyncOperation1),
нулевой
);
RegisterAsyncTask (задача);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(задача1);
ExecuteRegisteredAsyncTasks();
}
}
На первый взгляд кажется, что существует проблема: выполнит ли второй метод ExecuteRegisteredAsyncTasks первую зарегистрированную асинхронную задачу снова? На самом деле нет, поскольку в Asp.net2.0 предусмотрено, что один и тот же асинхронный метод будет выполняться только один раз. Таким образом, две асинхронные задачи имеют исключительное время выполнения и избегают взаимного вмешательства.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html