Si desea conocer la tecnología de páginas asincrónicas de Asp.Net2.0, debe leer atentamentehttp ://www.microsoft.com/china/MSDN/library/default.mspx?mfr =true, descargar su código fuente y estúdialo detenidamente. El texto completo presenta un total de 3 modelos de programación para implementar páginas asincrónicas, y cada uno tiene funciones más poderosas que el otro. No diré mucho más, solo veamos el último modelo: use la clase PageAsyncTask, el método RegisterAsyncTask, el método ExecuteRegisteredAsyncTasks y el método TimeoutAsyncOperation para registrar y ejecutar tareas asincrónicas, y llame al método de procesamiento de tiempo de espera durante largos períodos sin respuesta. El archivo AsyncPageTask.aspx.cs del código fuente proporcionado en el artículo original proporciona un ejemplo detallado de cómo utilizar este modelo para implementar páginas asincrónicas.
La mayor ventaja de este modelo es que puede manejar múltiples tareas asincrónicas en una solicitud de página, y el procesamiento de tiempo de espera también se puede usar para evitar la falta de respuesta al realizar operaciones asincrónicas. El autor original solo registró una tarea asincrónica en Page_Load, por lo que seguimos su ejemplo y registramos otra tarea asincrónica, como se muestra a continuación:
<%@ Página Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Página sin título" %>
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
Tarea PageAsyncTask = nueva PageAsyncTask(
nuevo BeginEventHandler (BeginAsyncOperation),
nuevo EndEventHandler (EndAsyncOperation),
nuevo EndEventHandler (TimeoutAsyncOperation),
nulo
);
PageAsyncTask tarea1 = nueva PageAsyncTask();
nuevo BeginEventHandler (BeginAsyncOperation1),
nuevo EndEventHandler (EndAsyncOperation1),
nuevo EndEventHandler (TimeoutAsyncOperation1),
nulo
);
RegistrarAsyncTask(tarea);
RegisterAsyncTask(tarea1);
}
}
Si el resultado devuelto por la tarea asincrónica se obtiene dentro del tiempo especificado en el atributo de página AsyncTimeout, la página se mostrará como esperábamos. Pero, ¿qué sucede si tienes un pequeño problema mientras realizas tu primera tarea y pierdes tiempo? Hay dos posibilidades: en primer lugar, el resultado de la primera tarea finalmente se devuelve y se muestra, y se considera que la segunda tarea ha agotado el tiempo de espera tan pronto como se inicia, ejecutando así su método TimeoutAsyncOperation; en segundo lugar, la primera tarea no lo hace; ha sido sentenciada a tiempo de espera en el momento en que se devuelve el resultado, por lo que la segunda tarea también debe haber sido sentenciada a tiempo de espera. La situación anterior se debe a que las dos tareas asincrónicas comparten el tiempo especificado por AsyncTimeout. Siempre que la tarea anterior se retrase durante la ejecución, inevitablemente afectará el funcionamiento de la tarea posterior. Entonces, ¿pueden dos tareas asincrónicas tener acceso exclusivo al tiempo especificado por AsyncTimeout? Esto requiere encontrar una manera a través del método ExecuteRegisteredAsyncTasks.
Vale la pena señalar que Asp.net2.0 restablecerá la propiedad AsyncTimeout cada vez que se llame a ExecuteRegisteredAsyncTasks, lo que significa que es posible lograr una tarea asincrónica exclusiva durante el tiempo especificado por AsyncTimeout. Según la forma actual de escribir el programa, si el método ExecuteRegisteredAsyncTasks no se llama explícitamente, Asp.net2.0 llamará a PreRenderComplete en el ciclo de vida de la página.
El método ExecuteRegisteredAsyncTasks se llama automáticamente antes del evento para ejecutar las dos tareas asincrónicas registradas. Debido a que ExecuteRegisteredAsyncTasks solo se ejecuta una vez pero se ejecutan dos tareas, las dos tareas deben compartir el tiempo de ejecución especificado por AsyncTimeout. Así que hice los siguientes ajustes al código:
protected void Page_Load(remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
Tarea PageAsyncTask = nueva PageAsyncTask (
nuevo BeginEventHandler (BeginAsyncOperation),
nuevo EndEventHandler (EndAsyncOperation),
nuevo EndEventHandler (TimeoutAsyncOperation),
nulo
);
PageAsyncTask tarea1 = nueva PageAsyncTask();
nuevo BeginEventHandler (BeginAsyncOperation1),
nuevo EndEventHandler (EndAsyncOperation1),
nuevo EndEventHandler (TimeoutAsyncOperation1),
nulo
);
RegistrarAsyncTask(tarea);
EjecutarTareasAsyncRegistered();
RegisterAsyncTask(tarea1);
EjecutarTareasAsyncRegistered();
}
}
A primera vista, parece haber un problema: ¿el segundo método ExecuteRegisteredAsyncTasks ejecutará nuevamente la primera tarea asincrónica registrada? En realidad no, porque Asp.net2.0 ha estipulado que el mismo método asincrónico solo se ejecutará una vez. Por tanto, las dos tareas asincrónicas tienen tiempo de ejecución exclusivo y evitan interferencias mutuas.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html