我的目标:
- 用户点击按钮
- 按钮开始 myTimeConsumingProcess()
- 同一页面中的 TextBox 每秒更新一次并添加一个“.”,直到该过程完成。
我所拥有的(这有效,但不是我想要的):
- 用户单击按钮开始 myTimeConsumingProcess() 的按钮
- 一个新线程执行 myTimeConsumingProcess()
- 用户被重定向到“处理”页面
- 使用布尔 Session 变量,此页面会无休止地刷新,直到留在上一页中的线程将 Session 变量切换为 false。
到目前为止的代码:
数据库检查器.aspx.cs
protected void btnStartProcess_Click(object sender, EventArgs e)
{
Session["Running"] = true;
Session["TextBoxContent"] = "Beginning myTimeConsumingProcess()...";
Thread thread = new Thread(new ThreadStart(MyTimeConsumingProcess));
thread.Start();
Response.Redirect("Processing.aspx");
}
private void myTimeConsumingProcess()
{
//do stuff!
Session["TextBoxContent"] += "SUCCESS!"
Session["Running"] = false;
}
处理.aspx
每秒刷新一次页面:
<meta http-equiv="refresh" content="1" />
处理.aspx.cs
停留在此页面上,每 1 秒刷新一次,直到线程(留在 DatabaseChecker.aspx.cs 中)将 Session 变量“Running”变为 false。
protected void Page_Load(object sender, EventArgs e)
{
TextBox1.Text = Session["TextBoxContent"].ToString();
Session["TextBoxContent"] += ".";
if ((bool)Session["Running"] == false)
{
Response.Redirect("DatabaseChecker.aspx");
}
}
我想要什么我无法弄清楚:
如果可能的话,我想避免重定向到另一个页面,而只是更新单击按钮的页面中的 TextBox。我尝试使用 QueryString 重定向到同一页面以指示我在此过程中的位置。但是,这不起作用 --- 到达了重定向到同一页面的代码,并且更新了文本,但是在进程完成之前似乎什么都没有发生(这违背了线程的目的)。
我已经尝试了我能想到的所有替代方案,包括UpdatePanel
、Timer
PageAsyncTask
控件以及通过将这些控件与 Threads 结合使用并且将 .aspx 页面的 Async 属性设置为 true 时我能想到的几乎所有组合。