/ / ASP.Net WebForms, bei der mehrere Abfragen gleichzeitig ausgeführt werden - asp.net, ajax, web-services, updatepanel

ASP.Net WebForms, die mehrere Abfragen gleichzeitig ausführen - asp.net, ajax, web-services, updatepanel

Dies ist für eine Enterprise-Webanwendung.

Wir bauen eine Titelseite / ein Dashboard dafürfragt unsere Datenbank nach Live-Statistiken. Die Seite verfügt über 3 Aktualisierungsfenster. Jedes Aktualisierungsfenster verfügt über ein Benutzersteuerelement, das Daten für seine Box abruft. Ruft den Benutzer die Steuerelemente UC_NotStarted, UC_Active und UC_Finished auf.

Wir haben die Abfragen erstellt, die die Daten zurückgebenund alle benötigen eine Weile (ca. 7 Sekunden). Wenn wir also die erste Seite mit einem Update-Panel ausführen, dreht sich das Bild ~ 21 Sekunden und zeigt alles an. Wir haben diesen Code in 3 Update-Panels unterteilt und das Laden auf bedingt gesetzt. Wenn wir dies tun, erhalten wir alle 7 Sekunden eine Box zum Laden. Dies ist ein Schritt in die richtige Richtung, aber sie werden sequentiell geladen (UC_NotStarted wird 7 Sekunden abgefragt und angezeigt, dann wird UC_Active 7 Sekunden lang ausgeführt, und schließlich läuft UC_Finished 7 Sekunden lang). Wir sind immer noch bei 21 Sekunden, aber alle 7 Sekunden werden Daten angezeigt.

Wir möchten, dass alle Daten in 7 angezeigt werdenSekunden, da alle Aktualisierungsfenster gleichzeitig die Daten abrufen sollen. Anstatt LinqToSQL zum Abrufen der Daten zu verwenden, neige ich jetzt zu Web-Services, um sie zu erhalten, aber ich bin mir nicht sicher, ob dies funktioniert.

Antworten:

0 für die Antwort № 1

Schaue auf die ThreadPool, speziell die QueueUserWorkItem Methode. Es ist durchaus möglich, die drei Abfragen gleichzeitig auszuführen und in einer zu sitzen Thread.Sleep Schleife wartet auf alle drei, um die Ausführung abzuschließen, damit Sie alle relevanten Teile der Seite aktualisieren können.

Für den folgenden Code sind mit großer Wahrscheinlichkeit Anpassungen erforderlich, aber Sie erhalten eine ungefähre Vorstellung davon, wie das geht:

public class QueryResult
{
public bool Completed;
public DataTable Result;
public int ResultId;
}

public void GetData()
{
var QueryResults = new List<QueryResult>();
queryResults.Add(new QueryResult() { ResultId = 1 });
queryResults.Add(new QueryResult() { ResultId = 2 });
queryResults.Add(new QueryResult() { ResultId = 3 });

ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[1]);
ThreadPool.QueueUserWorkItem(new WaitCallback(QueryRoutine), queryResults[2]);

var completedResults = new List<QueryResult>();
while(QueryResults.Count > 0)
{
for(int 1 = QueryResults.Count - 1; i >= 0; i--;)
{
if (queryResults[i].Completed)
{
completedResults.Add(queryResults[i]);
queryResults.RemoveAt(i);
}
}
Thread.Sleep(500);
}

// All background threads have completed, do something with the results,
// return them to the front-end, etc,..
}

public void QueryRoutine(object qR)
{
var queryResult = (QueryResult)qR;

// perform long running query here on a distinct thread, as QueryRoutine
// is now being run on three separate threads by the calls to QueueUserWorkItem
// based on queryResult.ResultId picking the relevant query for values
// of 1, 2 or 3

queryResult.Completed = true;
}