以下是我要做的事情:
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。
知道我在这里做错了什么。
由于
答案 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,很可能)返回服务器以获取操作进度的更新。