这适用于企业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服务来获取它,但不确定它是否会起作用。
答案 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;
}