La función de actualización de página asincrónica de ASP.NET 2.0 es realmente genial. Intenté usarla hoy para resolver un problema de mi aplicación y realmente me ayudó mucho.
Mi página necesita enviar una consulta al servicio de socket en segundo plano. En primer lugar, esta es una operación que puede no regresar durante mucho tiempo. En segundo lugar, para obtener la longitud variable y posiblemente los datos de respuesta grandes que devuelve el socket. servicio, tengo que usar dotNET. IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state para enviar de forma asincrónica el comando de socket y luego llamar iterativamente a int EndReceive(IAsyncResult asyncResult) en la función de devolución de llamada para obtener datos de respuesta Hasta que se obtengan los datos, esta serie de fragmentos de datos se almacenan en caché en una lista vinculada de MemoryBlock.
En este caso, si la página ASP.NET desea mostrar datos de respuesta en una tabla, debe actualizarse de forma asincrónica.
ASP.NET 1.x no admite de forma inherente páginas asincrónicas, pero mediante la perseverancia y la innovación, se pueden generar páginas asincrónicas. Para obtener más información general, consulte el artículo de MSDN® Magazine de junio de 2003 "Utilice subprocesos y cree controladores asincrónicos en su código web del lado del servidor", de Fritz Onion.
Pero ASP.NET 2.0 simplifica enormemente la forma de generar páginas asincrónicas. Primero use la directiva @ Page de la página para introducir el atributo Async="true".
En segundo lugar, cuando Page_Load, registre el evento Page_PreRender:
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// Ejecute el método cuando se complete el evento de registro Page_PreRender
// Enganche el evento PreRenderComplete para vincular
datos .PreRenderComplete += nuevo EventHandler(Page_PreRenderComplete);
A continuación, comencé mi viaje de operación asincrónica en la función de evento de clic de botón:
/// El método PageAsyncTask es una versión mejorada Además de los métodos de inicio y finalización del procesamiento de páginas asincrónicas,
/// también puede proporcionar un tiempo de espera El método de procesamiento. de la situación y el objeto de status durante el procesamiento.
///
Tarea PageAsyncTask = new PageAsyncTask(
new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
new EndEventHandler(EndSubmitKeywordsAsyncOperation),
new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),
null
)
;
/// Para la mayoría de las situaciones de procesamiento asincrónico simples, puede llamar directamente al método AddOnPreRenderCompleteAsync,
/// Envíe el código de procesamiento al principio y al final de la solicitud de página
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
La página pasa por su ciclo de vida de procesamiento normal hasta justo después de que se genera el evento PreRender. Luego, ASP.NET llama al método Begin BeginSubmitKeywordsAsyncOperation registrado mediante RegisterAsyncTask. En este método, enviaré mi comando al servicio sokcet y luego devolveré el objeto IasyncResult obtenido por el método socket.BeginReceive a ASP.NET.
Luego, después de que mi función de devolución de llamada asíncrona de socket finalmente obtiene todos los flujos de datos,
notifica a la página que el socket ha completado el trabajo
llamando acallback.Invoke(result);.
Entonces ASP.NET llama al método EndSubmitKeywordsAsyncOperation:
/// <summary>
/// El método de recepción después de que se completa la llamada asincrónica (una vez completada la operación asincrónica, se tomará un subproceso del grupo de subprocesos para atender la solicitud de la página ).
/// </summary>
/// <param name="ar"></param>
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
Después de eso, ASP.NET vuelve a llamar al evento Page_PreRender, para que en este evento la tabla de la página se pueda completar correctamente.
De esta manera se logró mi propósito. Además, si se agota el tiempo de espera para la reactivación después del envío en segundo plano,
también se puede usarvoid TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)
para manejarlo adecuadamente.
Recursos de referencia:
1:
Páginas asincrónicas en 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