Si vous souhaitez apprendre la technologie de page asynchrone d'Asp.Net2.0, vous devez lire attentivement http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true , et télécharger son code source et étudiez-le attentivement. Le texte intégral présente un total de 3 modèles de programmation pour implémenter des pages asynchrones, et chacun a des fonctions plus puissantes les unes que les autres. Je n'en dirai pas beaucoup plus, regardons simplement le dernier modèle : utilisez la classe PageAsyncTask, la méthode RegisterAsyncTask, la méthode ExecuteRegisteredAsyncTasks et la méthode TimeoutAsyncOperation pour enregistrer et exécuter des tâches asynchrones, et appeler la méthode de traitement du timeout pendant de longues périodes sans réponse. Le fichier AsyncPageTask.aspx.cs du code source fourni dans l'article d'origine fournit un exemple détaillé de la façon d'utiliser ce modèle pour implémenter des pages asynchrones.
Le plus grand avantage de ce modèle est qu'il peut gérer plusieurs tâches asynchrones dans une seule demande de page, et le traitement du délai d'attente peut également être utilisé pour éviter l'absence de réponse lors de l'exécution d'opérations asynchrones. L'auteur original a uniquement enregistré une tâche asynchrone dans Page_Load, nous suivons donc son exemple et enregistrons une autre tâche asynchrone, comme indiqué ci-dessous :
<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Page sans titre" %>
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
si (!IsPostBack)
{
Tâche PageAsyncTask = nouvelle PageAsyncTask (
nouveau BeginEventHandler (BeginAsyncOperation),
nouveau EndEventHandler (EndAsyncOperation),
nouveau EndEventHandler (TimeoutAsyncOperation),
nul
);
PageAsyncTask tâche1 = nouvelle PageAsyncTask(
nouveau BeginEventHandler (BeginAsyncOperation1),
nouveau EndEventHandler (EndAsyncOperation1),
nouveau EndEventHandler (TimeoutAsyncOperation1),
nul
);
RegisterAsyncTask(tâche);
RegisterAsyncTask(tâche1);
}
}
Si le résultat renvoyé par la tâche asynchrone est obtenu dans le délai spécifié par l'attribut de page AsyncTimeout, la page s'affichera comme prévu. Mais que se passe-t-il si vous rencontrez un petit problème lors de l'exécution de votre première tâche et perdez du temps ? Il y a deux possibilités : premièrement, le résultat de la première tâche est finalement renvoyé et affiché, et la deuxième tâche est jugée comme ayant expiré dès son démarrage, exécutant ainsi sa méthode TimeoutAsyncOperation ; deuxièmement, la première tâche ne le fait pas ; a été condamnée à un délai d'attente au moment où le résultat est renvoyé, la deuxième tâche doit donc également avoir été condamnée à un délai d'attente. La situation ci-dessus est due au fait que les deux tâches asynchrones partagent le temps spécifié par AsyncTimeout. Tant que la tâche précédente est retardée lors de l'exécution, cela affectera inévitablement le fonctionnement de la tâche suivante. Alors deux tâches asynchrones peuvent-elles avoir un accès exclusif à l'heure spécifiée par AsyncTimeout ? Cela nécessite de trouver un moyen via la méthode ExecuteRegisteredAsyncTasks ?
Il convient de noter qu'Asp.net2.0 réinitialisera la propriété AsyncTimeout à chaque appel de ExecuteRegisteredAsyncTasks, ce qui signifie qu'il est possible de réaliser une tâche asynchrone exclusive pour la durée spécifiée par AsyncTimeout. Selon la manière actuelle d'écrire le programme, si la méthode ExecuteRegisteredAsyncTasks n'est pas explicitement appelée, Asp.net2.0 appellera PreRenderComplete dans le cycle de vie de la page.
La méthode ExecuteRegisteredAsyncTasks est automatiquement appelée avant l'événement pour exécuter les deux tâches asynchrones enregistrées. Étant donné que ExecuteRegisteredAsyncTasks n'est exécuté qu'une seule fois mais que deux tâches sont exécutées, les deux tâches doivent partager le temps d'exécution spécifié par AsyncTimeout. J'ai donc apporté les ajustements suivants au code :
protected void Page_Load(object sender, EventArgs e)
{
si (!IsPostBack)
{
Tâche PageAsyncTask = nouvelle PageAsyncTask (
nouveau BeginEventHandler (BeginAsyncOperation),
nouveau EndEventHandler (EndAsyncOperation),
nouveau EndEventHandler (TimeoutAsyncOperation),
nul
);
PageAsyncTask tâche1 = nouvelle PageAsyncTask(
nouveau BeginEventHandler (BeginAsyncOperation1),
nouveau EndEventHandler (EndAsyncOperation1),
nouveau EndEventHandler (TimeoutAsyncOperation1),
nul
);
RegisterAsyncTask(tâche);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(tâche1);
ExecuteRegisteredAsyncTasks();
}
}
À première vue, il semble y avoir un problème : la deuxième méthode ExecuteRegisteredAsyncTasks exécutera-t-elle à nouveau la première tâche asynchrone enregistrée ? En fait non, car Asp.net2.0 a stipulé que la même méthode asynchrone ne sera exécutée qu'une seule fois. Par conséquent, les deux tâches asynchrones ont un temps d’exécution exclusif et évitent les interférences mutuelles.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html