我是一名Windows桌面应用程序程序员,我是ASP.NET新手。
当我在Page_Load(对象发件人,EventArgs e)执行长时间运行的数据库查询时,用户必须等到查询完成(查询需要很长时间)。
我可以使用SqlDataReader在另一个线程中逐行从表中提取数据并逐行向用户发送数据吗?这样,用户无需等到从数据库中提取所有行。
如果我使用WPF框架编写Windows桌面应用程序,我可以在另一个线程中逐行从数据库中提取数据,并使用BeginInvoke模式逐行将数据发送到UI。
但是,当我用ASP.NET编写Web应用程序时,我不知道最好的方法是什么。我可以在另一个线程中逐行提取数据并将提取的数据放入Session,然后我定期发送XMLHttpRequest以从Session获取数据吗?
我想知道是否存在长时间运行的数据库查询,在ASP.NET中处理它的最佳做法是什么?
提前致谢。
答案 0 :(得分:1)
我可以使用SqlDataReader逐行从表中提取数据 另一个线程并逐行向用户发送数据?就这样, 用户不需要等到从中拉出所有行 数据库中。
问题是ASP.NET应用程序的生命周期与Windows Form应用程序不同。呈现页面并向用户发送响应后,您将无法再处理数据。你可以做的是使用javascript。您可以使用UpdatePanel,ASP.NET的AJAX实现,或使用XMLHttpRequests。 (JQuery,我相信你已经听过,使用$ .ajax简化了这些请求)。您可以使用.gif加载代替您的数据,并在页面准备好后使用javascript获取数据。
逐行加载可能比较棘手。下面的代码将启动数据库调用,并在查询完成之前返回呈现的页面:
protected void Page_Load( object sender, EventArgs e)
{
string query = "SELECT * FROM db.Tablename;"
ThreadPool.QueueUserWorkItem(new WaitCallback (BuildDataSet), query);
}
private void BuildDataSet(object query)
{
Queue Q = new Queue();
//Connection String, etc.
while rdr.Read()
{
Q.Enqueue(rdr["Column"];
}
}
您需要第二页来处理获取行的XMLHttpRequests。难点在于持久化这些数据,在请求之间进行识别,以及可能的内存管理。
我能想到的最简单的路径是在page_load上执行SELECT TOP (50)
,然后在获取完整数据后ajax。