Ich versuche, Daten in Update-Panels auf einer Website asynchron anzuzeigen, wo die Datenwiederauffindungs-Tasks unterschiedlich lange dauern. Ich möchte jedes Panel aktualisieren, um die Daten auf der Seite nach Abschluss jeder Aufgabe anzuzeigen.
Unabhängig davon, was ich versuche, ändern alle Update Panels ihren Inhalt, nachdem die letzte Aufgabe abgeschlossen wurde.
Zum Beispiel:
Ich habe zwei Aufgaben:
Das erwartete Ergebnis ist, dass sich nur die Bezeichnung in UpdatePanel1 nach 5 Sekunden ändert, beide Update-Panels werden jedoch gleichzeitig um 10 Sekunden aktualisiert.
Beide Update-Panels sind auf updatemode="Conditional" gesetzt und sie werden aufgefordert, Postback von Client-Javascript. Im Folgenden finden Sie eine vollständige Auflistung des obigen Beispiels.
Was fehlt mir hier? Wie bekomme ich ein Update-Panel zum Laden, und das andere, beide Aufgaben laufen asynchron?
Danke,
TM
ASPX:
%Vor%C #:
%Vor%Setzen Sie einfach ein Trigger-Tag in jedes UpdatePanel, das auf einen asp: Timer zeigt, und setzen Sie das Intervall auf 5000 und 10000 Millisekunden.
Unten ist die Lösung, die Sie fragen, mit UpdatePanel, aber passen Sie auf, weil alle 5 und 10 Sekunden ein PostBack für Timer ausgelöst wird:
Ich empfehle die Verwendung von Javascript oder jQuery, um PostBacks zu vermeiden.
ASPX:
%Vor%C #
%Vor%Ich vermute, dass Sie das nicht asynchron aufrufen, wie Sie denken, dass b / c des Threads beitritt. Es sieht so aus, als würden Sie Block OnPrender blockieren, bis Thread 2 beendet wird. Da sowohl 1 als auch 2 von derselben Methode aufgerufen werden, sind Sie blockiert, bis beide erledigt sind. Wenn Sie ein paar Schreibstriche einwerfen, um zu sehen, wann die Dinge aufgerufen werden, wird es vielleicht etwas einfacher zu sehen, was passiert.
Ich vermute auch, dass der Text auf 1 nicht wirklich aktualisiert wird, bis der Prerender von dem, was ich weiß, abgeschlossen ist. Traditionelles ASP.NET, nichts wird zurück an den Client gesendet, bis nach dem Prerender abgeschlossen ist. Aber ich weiß nicht viel über das Update-Panel, also könnte ich darüber reden und antizipieren, dass ich abgemeldet werde ...
Die Joins in Ihrem Pre-Render-Handler blockieren, dass das Rendering zum Client zurückkehrt. Statt dessen, was Sie haben, vermute ich, dass Sie stattdessen so etwas tun könnten:
%Vor%Dieser Code hat den unglücklichen Nebeneffekt, dass er darauf angewiesen ist, zu wissen, welcher Thread zuerst zurückkehrt.
Wenn Sie jedoch nur herausfinden möchten, wie Sie Ereignisse vom Server zum Client senden (und HTML 5 ist eine Option), empfehle ich, serverseitige Ereignisse (oder Web-Sockets, wenn Sie Vollduplex-Kommunikation benötigen). Wenn html 5 keine Option ist, glaube ich, dass Sie einige Javascript-Hacks verwenden können, um Web-Sockets zu simulieren. Sie können einige hier lesen und hier .
edit: Links für nicht-HTML 5 Alternativen hinzugefügt
Können Sie .NET 4.5 verwenden oder sind Sie auf frühere Versionen beschränkt? v4.5 hat viele neue Funktionen, die das Erstellen von asynchronen Methoden sehr einfach machen, ohne sich um das Thread-Management kümmern zu müssen. Dieser Link enthält eine gute Erklärung, wie eine asynchrone Methode mit der neuen % co_de implementiert werden kann % Aufgabe und Task
/ async
Operatoren: Arbeiten mit asynchronen Operationen in ASP.NET 4.5 Web Forms
Im Wesentlichen müssen Sie nur für jede Methode, die für das Aktualisieren des Updatepanels verantwortlich ist, ein await
erstellen und beim Laden der Seite starten. Am Ende kann jede Aufgabe für 5 oder 10 Sekunden schlafen, bevor sie sich selbst anruft, um Ihnen den gewünschten Effekt zu geben.
Tags und Links c# asp.net-ajax updatepanel