Die asynchrone Seitenaktualisierungsfunktion von ASP.NET 2.0 ist wirklich cool. Ich habe heute versucht, sie zur Lösung eines meiner Anwendungsprobleme zu verwenden, und sie hat wirklich sehr geholfen.
Meine Seite muss im Hintergrund eine Abfrage an den Socket-Dienst senden. Dies ist ein Vorgang, der möglicherweise längere Zeit nicht zurückgegeben wird, um die vom Socket zurückgegebenen variablen Längen und möglicherweise großen Antwortdaten zu erhalten service, ich muss dotNET verwenden. IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state); ; in der Rückruffunktion zum Abrufen von Antwortdaten Bis zum Abruf der Daten wird diese Reihe von Datenfragmenten in einer verknüpften MemoryBlock-Liste zwischengespeichert.
Wenn die ASP.NET-Seite in diesem Fall Antwortdaten in einer Tabelle anzeigen möchte, muss sie asynchron aktualisiert werden.
ASP.NET 1.x unterstützt von Natur aus keine asynchronen Seiten, aber durch Beharrlichkeit und Innovation können asynchrone Seiten generiert werden. Weitere Übersichtsinformationen finden Sie im MSDN® Magazine-Artikel vom Juni 2003 „Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code“ von Fritz Onion.
Aber ASP.NET 2.0 vereinfacht die Generierung asynchroner Seiten erheblich. Verwenden Sie zunächst die @ Page-Direktive der Seite, um das Attribut Async="true" einzuführen.
Zweitens, wenn Page_Load, das Ereignis Page_PreRender registrieren:
private void Page_Load(object sender, System.EventArgs e)
{
if
(!IsPostBack)
{
// Methode ausführen, wenn das Registrierungsereignis Page_PreRender abgeschlossen ist
// PreRenderComplete-Ereignis zur Datenbindung einbinden
.PreRenderComplete += new EventHandler(Page_PreRenderComplete);
Als nächstes begann ich meine Reise zum asynchronen Betrieb in der Schaltflächenklick-Ereignisfunktion:
/// Die PageAsyncTask-Methode ist eine erweiterte Version. Zusätzlich zu den Start- und Endmethoden für die asynchrone Seitenverarbeitung selbst
kann /// auch eine Timeout-Verarbeitungsmethode bereitstellen der Situation und das Statusobjekt bei der Bearbeitung.
///
PageAsyncTask task = new PageAsyncTask(
new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
new EndEventHandler(EndSubmitKeywordsAsyncOperation),
new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),
null
)
;
/// Für die meisten einfachen asynchronen Verarbeitungssituationen können Sie die AddOnPreRenderCompleteAsync-Methode direkt aufrufen.
/// Den Verarbeitungscode am Anfang und am Ende der Seitenanforderung senden.
//AddOnPreRenderCompleteAsync(
// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),
// new EndEventHandler (EndSubmitKeywordsAsyncOperation)
//);
Die Seite durchläuft ihren normalen Verarbeitungslebenszyklus, bis kurz nachdem das PreRender-Ereignis ausgelöst wird. Anschließend ruft ASP.NET die mit RegisterAsyncTask registrierte Begin-Methode BeginSubmitKeywordsAsyncOperation auf. Bei dieser Methode übermittle ich meinen Befehl an den sokcet-Dienst und gebe dann das von der socket.BeginReceive-Methode erhaltene IasyncResult-Objekt an ASP.NET zurück.
Nachdem meine asynchrone Socket-Callback-Funktion schließlich alle Datenströme abgerufen hat,
benachrichtigt sie die Seite durch den Aufruf voncallback.Invoke(result);
darüber, dass der Socket die Arbeit abgeschlossen hat
.Daher ruft ASP.NET die EndSubmitKeywordsAsyncOperation-Methode auf:
///
/// Die Empfangsmethode nach Abschluss des asynchronen Aufrufs (nach Abschluss des asynchronen Vorgangs wird ein Thread aus dem Thread-Pool entnommen, um die Seitenanforderung zu bedienen ).
///
///
void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)
{
_resultDataset =_submit.getResultDataset
(ar);
.
Danach ruft ASP.NET erneut das Page_PreRender-Ereignis auf, damit bei diesem Ereignis die Tabelle auf der Seite korrekt gefüllt werden kann.
Auf diese Weise wurde mein Ziel erreicht. Wenn außerdem das Warten auf die Reaktivierung nach der Übermittlung an den Hintergrund abläuft,
kann auchvoid TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)
verwendet werden, um angemessen damit umzugehen.
Referenzressourcen:
1:
Asynchrone Seiten in 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