获取数据时显示进度标签

时间:2011-09-12 14:38:50

标签: c# asp.net

以下是我要做的事情:

 void Fetch()
    {
        //Code To Fetch Data        
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        lblSatus.Text = "Fetching Data...";
        Thread t = new Thread(Fetch);
        t.Start();           
        t.Join();
        lblSatus.Text = "Got Data";
    }

但点击按钮,它会直接显示GotData。

知道我在这里做错了什么。

由于

2 个答案:

答案 0 :(得分:0)

t.Start();之后你需要做一些检查的事情......以下几行:

while (!t.Completed) // pseudo
{
    // wait
    Thread.Sleep(10);
}

否则,线程旋转并开始执行,而主线程只是通过。

答案 1 :(得分:0)

我认为你在处理ASP.NET请求时误解了服务器端线程之间的关系,以及浏览器端的体验。具体来说,对于给定的HttpRequest(在您的示例中,Request是一个回发,触发btn_Click事件),将只有一个Response。无论你在服务器端做什么线程操作,都是如此。

在您的示例中,看起来您希望服务器响应浏览器,lblSatus的值为“获取数据...”。稍后当操作完成时,服务器将再次“响应”浏览器,lblSatus的值为“Got Data”。由于Http通信的“握手”性质,这将无法工作:一个请求将导致一个响应(因此,lblSatus只有一个值)。

您要尝试做的事情(在长时间运行期间为最终用户提供逻辑“进度条”)是一个常见的要求。不幸的是,我知道在ASP.NET中没有简单的内置方法可以做到这一点。我怀疑大多数人都是通过轮询模型来实现的:浏览器启动操作,服务器以某种异步方式将其启动,不会延迟将响应发送回浏览器。然后浏览器定期(通过javascript,很可能)返回服务器以获取操作进度的更新。