ASP.Net WebForms同时运行多个查询

时间:2010-08-24 20:58:09

标签: asp.net ajax web-services updatepanel

这适用于企业Web应用程序。

我们正在构建一个首页/仪表板,用于查询我们的数据库以获取实时统计信息。该页面有3个更新面板,每个更新面板都有一个用户控件,可以为其框提取数据。让我们调用用户控件UC_NotStarted,UC_Active和UC_Finished。

我们构建了返回数据的查询,所有这些查询都需要一段时间才能运行(每次约7秒)。因此,如果我们让第一页运行一个更新面板,图像旋转约21秒并显示所有内容。我们已将该代码分解为3个更新面板并将加载设置为条件。当我们这样做时,我们得到一个盒子每7秒加载一次。这是向正确方向迈出的一步,但是它们按顺序加载(查询UC_NotStarted等待7秒并显示,然后UC_Active持续7秒,最后UC_Finished运行7秒)。我们仍处于21秒,但数据每7秒显示一次。

我们希望所有数据都能在7秒内显示,因为所有更新面板都应该同时获取数据。而不是使用LinqToSQL来提取数据,我现在倾向于使用Web服务来获取它,但不确定它是否会起作用。

1 个答案:

答案 0 :(得分:0)

查看ThreadPool,特别是QueueUserWorkItem方法。这很可能同时运行3个查询并坐在Thread.Sleep循环中等待所有三个查询完成执行,这样您就可以更新页面的所有相关部分。

以下代码几乎肯定需要调整,但会让您大致了解如何执行此操作:

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;
}