- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是一名 Windows 桌面应用程序程序员,我是 ASP.NET 的新手。
当我在 Page_Load(object sender, EventArgs e) 执行长时间运行的数据库查询时,用户必须等到查询完成(查询需要很长时间)。
我可以使用 SqlDataReader 在另一个线程中逐行从表中提取数据并将数据逐行发送给用户吗?这样,用户就不需要等到所有行都从数据库中拉出。
如果我使用 WPF 框架编写 Windows 桌面应用程序,我可以在另一个线程中逐行从数据库中提取数据,然后使用 BeginInvoke 模式逐行将数据发送到 UI。
但是,当我使用 ASP.NET 编写 Web 应用程序时,我不知道什么是最好的方法。是否可以在另一个线程中逐行拉取数据并将拉取的数据放入Session,然后定期发送XMLHttpRequest从Session中获取拉取的数据?
我想知道是否存在长时间运行的数据库查询,在 ASP.NET 中处理它的最佳做法是什么?
最佳答案
Can I use SqlDataReader to pull data from a table row-by-row in another thread and send the data to users row-by-row? In this way, the users doesn't need to wait until the all rows are pulled from the database.
问题是 ASP.NET 应用程序的生命周期与 Windows 窗体应用程序不同。呈现页面并向用户发送响应后,您将无法再使用数据。您可以 做的是使用 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。
关于asp.net - 如何在 ASP.NET 中处理长时间运行的数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085556/
我是一名优秀的程序员,十分优秀!