4

我是一名 Windows 桌面应用程序程序员,并且是 ASP.NET 的新手。

当我在 Page_Load(object sender, EventArgs e) 处执行长时间运行的数据库查询时,用户必须等到查询完成(查询需要很长时间)。

我可以使用 SqlDataReader 在另一个线程中逐行从表中提取数据并将数据逐行发送给用户吗?这样,用户不需要等到所有行都从数据库中提取出来。

如果我使用 WPF 框架编写 Windows 桌面应用程序,我可以在另一个线程中逐行从数据库中提取数据,并使用 BeginInvoke 模式将数据逐行发送到 UI。

但是,当我使用 ASP.NET 编写 Web 应用程序时,我不知道最好的方法是什么。我可以在另一个线程中逐行提取数据并将提取的数据放入 Session,然后定期发送 XMLHttpRequest 以从 Session 中获取提取的数据吗?

我想知道是否存在长时间运行的数据库查询,在 ASP.NET 中处理它的最佳做法是什么?

4

1 回答 1

1

我可以使用 SqlDataReader 在另一个线程中逐行从表中提取数据并将数据逐行发送给用户吗?这样,用户不需要等到所有行都从数据库中提取出来。

问题是 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。困难在于持久化这些数据,在请求之间识别它,以及可能的内存管理。

我能想到的最简单的方法是SELECT TOP (50)在 page_load 上执行一个操作,然后在获取完整数据后将其 ajax。

于 2013-09-30T04:54:41.003 回答