La fonction d'actualisation de page asynchrone d'ASP.NET 2.0 est vraiment cool. J'ai essayé de l'utiliser pour résoudre un de mes problèmes d'application aujourd'hui, et cela m'a vraiment beaucoup aidé.
Ma page doit soumettre une requête au service socket en arrière-plan. Tout d'abord, il s'agit d'une opération qui peut ne pas revenir avant longtemps. Deuxièmement, afin d'obtenir la longueur variable et éventuellement les données de réponse volumineuses renvoyées par le socket. service, je dois utiliser dotNET. IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state); méthode pour soumettre de manière asynchrone la commande socket, puis appeler de manière itérative int EndReceive(IAsyncResult asyncResult) ; dans la fonction de rappel pour obtenir les données de réponse Jusqu'à ce que les données soient récupérées, cette série de fragments de données est mise en cache dans une liste chaînée MemoryBlock.
Dans ce cas, si la page ASP.NET souhaite afficher les données de réponse dans un tableau, elles doivent être actualisées de manière asynchrone.
ASP.NET 1.x ne prend pas automatiquement en charge les pages asynchrones, mais grâce à la persévérance et à l'innovation, des pages asynchrones peuvent être générées. Pour plus d'informations générales, consultez l'article MSDN® Magazine de juin 2003 « Utiliser des threads et créer des gestionnaires asynchrones dans votre code Web côté serveur » par Fritz Onion.
Mais ASP.NET 2.0 simplifie grandement la manière de générer des pages asynchrones. Utilisez d'abord la directive @ Page de la page pour introduire l'attribut Async="true".
Deuxièmement, lorsque Page_Load, enregistrez l'événement Page_PreRender :
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// Exécutez la méthode lorsque l'événement d'enregistrement Page_PreRender est terminé
// Hook PreRenderComplete event for data bind
this .PreRenderComplete += new EventHandler(Page_PreRenderComplete);
Ensuite, j'ai commencé mon parcours d'opération asynchrone dans la fonction d'événement de clic de bouton :
/// La méthode PageAsyncTask est une version améliorée en plus des méthodes de début et de fin de traitement de page asynchrone elles-mêmes,
/// peut également fournir un délai d'attente pour la méthode de traitement. de la situation et l'objet d'état lors du traitement.
///
Tâche PageAsyncTask = new PageAsyncTask (
new BeginEventHandler (BeginSubmitKeywordsAsyncOperation),
new EndEventHandler (EndSubmitKeywordsAsyncOperation),
new EndEventHandler (TimeoutSubmitKeywordsAsyncOperation),
null
RegisterAsyncTask (tâche)
;
/// Pour les situations de traitement asynchrone les plus simples, vous pouvez appeler directement la méthode AddOnPreRenderCompleteAsync,
/// Soumettre le code de traitement au début et à la fin de la requête de page
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
La page suit son cycle de vie de traitement normal jusqu'à ce que l'événement PreRender soit déclenché. Ensuite, ASP.NET appelle la méthode Begin BeginSubmitKeywordsAsyncOperation enregistrée à l’aide de RegisterAsyncTask. Dans cette méthode, je soumettrai ma commande au service sokcet, puis je renverrai l'objet IasyncResult obtenu par la méthode socket.BeginReceive à ASP.NET.
Ensuite, une fois que ma fonction de rappel asynchrone de socket a finalement obtenu tous les flux de données,
elle informe la page que le socket a terminé le travail
en appelantcallback.Invoke(result);.
Ainsi, ASP.NET appelle la méthode EndSubmitKeywordsAsyncOperation :
/// <summary>
/// La méthode de réception une fois l'appel asynchrone terminé (une fois l'opération asynchrone terminée, un thread sera extrait du pool de threads pour répondre à la demande de page ).
/// </summary>
/// <param name="ar"></param>
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
Après cela, ASP.NET appelle à nouveau l'événement Page_PreRender afin que, dans cet événement, le tableau de la page puisse être rempli correctement.
De cette façon, mon objectif a été atteint. De plus, si l'attente de réactivation après la soumission en arrière-plan expire,
void TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)
peut égalementêtre utilisé pour le gérer de manière appropriée.
Ressources de référence :
1 :
Pages asynchrones dans 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