A função de atualização assíncrona de páginas do ASP.NET 2.0 é muito legal. Tentei usá-la para resolver um problema meu de aplicação hoje e realmente ajudou bastante.
Minha página precisa enviar uma consulta ao serviço de soquete em segundo plano. Em primeiro lugar, esta é uma operação que pode demorar muito para obter o comprimento variável e possivelmente grandes dados de resposta retornados pelo soquete. serviço, tenho que usar dotNET. IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state method para enviar de forma assíncrona o comando de soquete e, em seguida, chamar iterativamente int EndReceive(IAsyncResult asyncResult)); ; na função de retorno de chamada para obter dados de resposta Até que os dados sejam buscados, essa série de fragmentos de dados é armazenada em cache em uma lista vinculada do MemoryBlock.
Neste caso, se a página ASP.NET quiser exibir dados de Resposta em uma tabela, ela deverá ser atualizada de forma assíncrona.
O ASP.NET 1.x não oferece suporte inerente a páginas assíncronas, mas por meio de perseverança e inovação, páginas assíncronas podem ser geradas. Para obter mais informações gerais, consulte o artigo da MSDN® Magazine de junho de 2003 "Usar threads e criar manipuladores assíncronos em seu código da Web do lado do servidor", de Fritz Onion.
Mas o ASP.NET 2.0 simplifica muito a maneira de gerar páginas assíncronas. Primeiro use a diretiva @ Page da página para introduzir o atributo Async="true".
Em segundo lugar, quando Page_Load, registre o evento Page_PreRender:
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// Execute o método quando o evento de registro Page_PreRender for concluído
// Gancho o evento PreRenderComplete para vinculação de dados
this .PreRenderComplete += new EventHandler(Page_PreRenderComplete);
Em seguida, comecei minha jornada de operação assíncrona na função de evento de clique de botão:
/// O método PageAsyncTask é uma versão aprimorada, além dos próprios métodos de início e fim de processamento de página assíncrona,
/// também pode fornecer um tempo limite O método de processamento. da situação e o objeto de status durante o processamento.
///
tarefa PageAsyncTask = new PageAsyncTask(
new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
new EndEventHandler(EndSubmitKeywordsAsyncOperation),
new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),
null
)
;
/// Para a maioria das situações de processamento assíncrono simples, você pode chamar diretamente o método AddOnPreRenderCompleteAsync,
/// Enviar o código de processamento no início e no final da solicitação da página
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
A página passa por seu ciclo de vida normal de processamento até logo após o evento PreRender ser gerado. Em seguida, o ASP.NET chama o método Begin BeginSubmitKeywordsAsyncOperation registrado usando RegisterAsyncTask. Neste método, enviarei meu comando ao serviço sokcet e, em seguida, retornarei o objeto IasyncResult obtido pelo método socket.BeginReceive para o ASP.NET.
Então, depois que minha função de retorno de chamada assíncrona do soquete finalmente obtiver todos os fluxos de dados,
ela notificará a página de que o soquete concluiu o trabalho
chamandocallback.Invoke(result);.
Portanto, o ASP.NET chama o método EndSubmitKeywordsAsyncOperation:
/// <summary>
/// O método de recebimento após a conclusão da chamada assíncrona (após a conclusão da operação assíncrona, um thread será retirado do pool de threads para atender a solicitação da página ).
/// </summary>
/// <param name="ar"></param>
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
Após isso, o ASP.NET chama novamente o evento Page_PreRender, para que neste evento a tabela da página possa ser preenchida corretamente.
Desta forma, meu propósito foi alcançado. Além disso, se a espera pela reativação após o envio para o segundo plano expirar,
void TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)
também poderáser usado para lidar com isso de forma adequada.
Recursos de referência:
1:
Páginas assíncronas no ASP.NET 2.0
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true
http://www.cnblogs. /zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html