Se você quiser aprender a tecnologia de página assíncrona do Asp.Net2.0, leia atentamente http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true e baixe seu código-fonte e estude-o cuidadosamente. O texto completo apresenta um total de 3 modelos de programação para implementação de páginas assíncronas, e cada um possui funções mais poderosas que o outro. Não direi muito mais, vamos apenas dar uma olhada no último modelo: use a classe PageAsyncTask, o método RegisterAsyncTask, o método ExecuteRegisteredAsyncTasks e o método TimeoutAsyncOperation para registrar e executar tarefas assíncronas e chame o método de processamento de tempo limite para longos períodos sem resposta. O arquivo AsyncPageTask.aspx.cs do código-fonte fornecido no artigo original fornece um exemplo detalhado de como usar esse modelo para implementar páginas assíncronas.
A maior vantagem deste modelo é que ele pode lidar com múltiplas tarefas assíncronas em uma solicitação de página, e o processamento de tempo limite também pode ser usado para evitar falta de resposta ao executar operações assíncronas. O autor original registrou apenas uma tarefa assíncrona em Page_Load, então seguimos seu exemplo e registramos outra tarefa assíncrona, conforme mostrado abaixo:
<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Página sem título" %>
protegido void Page_Load (remetente do objeto, EventArgs e)
{
se (!IsPostBack)
{
Tarefa PageAsyncTask = new PageAsyncTask (
novo BeginEventHandler(BeginAsyncOperation),
novo EndEventHandler(EndAsyncOperation),
novo EndEventHandler(TimeoutAsyncOperation),
nulo
);
PageAsyncTask tarefa1 = new PageAsyncTask(
novo BeginEventHandler (BeginAsyncOperation1),
novo EndEventHandler(EndAsyncOperation1),
novo EndEventHandler (TimeoutAsyncOperation1),
nulo
);
RegisterAsyncTask(tarefa);
RegisterAsyncTask(tarefa1);
}
}
Se o resultado retornado pela tarefa assíncrona for obtido dentro do tempo especificado no atributo da página AsyncTimeout, a página será exibida conforme esperávamos. Mas o que acontece se você tiver alguns problemas ao realizar sua primeira tarefa e perder tempo? Existem duas possibilidades: primeiro, o resultado da primeira tarefa é finalmente retornado e exibido, e a segunda tarefa é considerada expirada assim que é iniciada, executando assim seu método TimeoutAsyncOperation; segundo, a primeira tarefa não; foi condenado ao tempo limite no momento em que o resultado é retornado, portanto, a segunda tarefa também deve ter sido condenada ao tempo limite. A situação acima se deve ao fato de as duas tarefas assíncronas compartilharem o tempo especificado por AsyncTimeout. Enquanto a tarefa anterior for atrasada durante a execução, isso afetará inevitavelmente a operação da tarefa subsequente. Então, duas tarefas assíncronas podem ter acesso exclusivo ao tempo especificado por AsyncTimeout? Isso requer encontrar um caminho através do método ExecuteRegisteredAsyncTasks.
Vale ressaltar que o Asp.net2.0 irá redefinir a propriedade AsyncTimeout toda vez que ExecuteRegisteredAsyncTasks for chamado, o que significa que é possível realizar uma tarefa assíncrona exclusiva para o tempo especificado por AsyncTimeout. De acordo com a forma atual de escrever o programa, se o método ExecuteRegisteredAsyncTasks não for chamado explicitamente, o Asp.net2.0 chamará PreRenderComplete no ciclo de vida da página.
O método ExecuteRegisteredAsyncTasks é chamado automaticamente antes do evento para executar as duas tarefas assíncronas registradas. Como ExecuteRegisteredAsyncTasks é executado apenas uma vez, mas duas tarefas são executadas, as duas tarefas precisam compartilhar o tempo de execução especificado por AsyncTimeout. Então fiz os seguintes ajustes no código:
protected void Page_Load(object sender, EventArgs e)
{
se (!IsPostBack)
{
Tarefa PageAsyncTask = new PageAsyncTask (
novo BeginEventHandler(BeginAsyncOperation),
novo EndEventHandler(EndAsyncOperation),
novo EndEventHandler(TimeoutAsyncOperation),
nulo
);
PageAsyncTask tarefa1 = new PageAsyncTask(
novo BeginEventHandler (BeginAsyncOperation1),
novo EndEventHandler(EndAsyncOperation1),
novo EndEventHandler(TimeoutAsyncOperation1),
nulo
);
RegisterAsyncTask(tarefa);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(tarefa1);
ExecuteRegisteredAsyncTasks();
}
}
À primeira vista, parece haver um problema: o segundo método ExecuteRegisteredAsyncTasks executará novamente a primeira tarefa assíncrona registrada? Na verdade não, porque o Asp.net2.0 estipulou que o mesmo método assíncrono será executado apenas uma vez. Portanto, as duas tarefas assíncronas possuem tempo de execução exclusivo e evitam interferência mútua.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html