Wenn Sie die asynchrone Seitentechnologie von Asp.Net2.0 erlernen möchten, müssen Sie http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true sorgfältig lesen und den Quellcode herunterladen Studieren Sie es sorgfältig. Im Volltext werden insgesamt drei Programmiermodelle für die Implementierung asynchroner Seiten vorgestellt, von denen jedes über leistungsfähigere Funktionen verfügt als das andere. Ich werde nicht viel mehr sagen, schauen wir uns einfach das letzte Modell an: Verwenden Sie die PageAsyncTask-Klasse, die RegisterAsyncTask-Methode, die ExecuteRegisteredAsyncTasks-Methode und die TimeoutAsyncOperation-Methode, um asynchrone Aufgaben zu registrieren und auszuführen, und rufen Sie die Timeout-Verarbeitungsmethode für längere Zeiträume ohne Antwort auf. Die Datei AsyncPageTask.aspx.cs des im Originalartikel bereitgestellten Quellcodes bietet ein detailliertes Beispiel für die Verwendung dieses Modells zur Implementierung asynchroner Seiten.
Der größte Vorteil dieses Modells besteht darin, dass es mehrere asynchrone Aufgaben in einer Seitenanforderung verarbeiten kann und die Timeout-Verarbeitung auch verwendet werden kann, um eine Nichtreaktion bei der Ausführung asynchroner Vorgänge zu vermeiden. Der ursprüngliche Autor hat in Page_Load nur eine asynchrone Aufgabe registriert, daher folgen wir seinem Beispiel und registrieren eine weitere asynchrone Aufgabe, wie unten gezeigt:
<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Unbenannte Seite" %>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask task = new PageAsyncTask(
neuer BeginEventHandler(BeginAsyncOperation),
neuer EndEventHandler(EndAsyncOperation),
neuer EndEventHandler(TimeoutAsyncOperation),
null
);
PageAsyncTask task1 = new PageAsyncTask(
neuer BeginEventHandler(BeginAsyncOperation1),
neuer EndEventHandler(EndAsyncOperation1),
neuer EndEventHandler(TimeoutAsyncOperation1),
null
);
RegisterAsyncTask(task);
RegisterAsyncTask(task1);
}
}
Wenn das von der asynchronen Aufgabe zurückgegebene Ergebnis innerhalb der im Seitenattribut AsyncTimeout angegebenen Zeit erhalten wird, wird die Seite wie erwartet angezeigt. Aber was passiert, wenn Sie bei der Erledigung Ihrer ersten Aufgabe auf kleine Probleme stoßen und Zeit verlieren? Es gibt zwei Möglichkeiten: Erstens wird das Ergebnis der ersten Aufgabe schließlich zurückgegeben und angezeigt, und die zweite Aufgabe wird sofort nach dem Start als abgelaufen beurteilt, sodass ihre TimeoutAsyncOperation-Methode ausgeführt wird. Zweitens führt die erste Aufgabe dies nicht aus zum Zeitpunkt der Rückgabe des Ergebnisses zu einer Zeitüberschreitung verurteilt wurde, daher muss auch die zweite Aufgabe zu einer Zeitüberschreitung verurteilt worden sein. Die obige Situation ist darauf zurückzuführen, dass sich die beiden asynchronen Aufgaben die von AsyncTimeout angegebene Zeit teilen. Solange die vorherige Aufgabe während der Ausführung verzögert wird, wirkt sich dies zwangsläufig auf den Betrieb der nachfolgenden Aufgabe aus. Können also zwei asynchrone Aufgaben exklusiven Zugriff auf die durch AsyncTimeout angegebene Zeit haben? Dazu muss ein Weg über die ExecuteRegisteredAsyncTasks-Methode gefunden werden.
Es ist erwähnenswert, dass Asp.net2.0 die AsyncTimeout-Eigenschaft jedes Mal zurücksetzt, wenn ExecuteRegisteredAsyncTasks aufgerufen wird. Dies bedeutet, dass es möglich ist, eine asynchrone Aufgabe exklusiv für die durch AsyncTimeout angegebene Zeit auszuführen. Gemäß der aktuellen Schreibweise des Programms ruft Asp.net2.0 im Seitenlebenszyklus PreRenderComplete auf, wenn die ExecuteRegisteredAsyncTasks-Methode nicht explizit aufgerufen wird.
Die ExecuteRegisteredAsyncTasks-Methode wird vor dem Ereignis automatisch aufgerufen, um die beiden registrierten asynchronen Aufgaben auszuführen. Da ExecuteRegisteredAsyncTasks nur einmal ausgeführt wird, aber zwei Aufgaben ausgeführt werden, müssen sich die beiden Aufgaben die durch AsyncTimeout angegebene Laufzeit teilen. Daher habe ich folgende Anpassungen am Code vorgenommen:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask task = new PageAsyncTask(
neuer BeginEventHandler(BeginAsyncOperation),
neuer EndEventHandler(EndAsyncOperation),
neuer EndEventHandler(TimeoutAsyncOperation),
null
);
PageAsyncTask task1 = new PageAsyncTask(
neuer BeginEventHandler(BeginAsyncOperation1),
neuer EndEventHandler(EndAsyncOperation1),
neuer EndEventHandler(TimeoutAsyncOperation1),
null
);
RegisterAsyncTask(task);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(task1);
ExecuteRegisteredAsyncTasks();
}
}
Auf den ersten Blick scheint es ein Problem zu geben: Wird die zweite ExecuteRegisteredAsyncTasks-Methode die erste registrierte asynchrone Aufgabe erneut ausführen? Eigentlich nein, denn Asp.net2.0 hat festgelegt, dass dieselbe asynchrone Methode nur einmal ausgeführt wird. Daher haben die beiden asynchronen Aufgaben eine exklusive Laufzeit und vermeiden gegenseitige Störungen.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html