gpt4 book ai didi

asp.net - 如何在 ASP.NET 中处理长时间运行的数据库查询

转载 作者:太空狗 更新时间:2023-10-30 01:57:47 30 4
gpt4 key购买 nike

我是一名 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com