我的目标:
- 用户点击按钮。
- 按钮开始运行myTimeConsumingProcess()函数。
- 同一页面中的文本框每秒更新一次并添加一个“.”,直到进程完成。
我已经有的(这个可以工作,但不完全符合我的要求):
- 用户点击按钮,开始运行myTimeConsumingProcess()函数。
- 一个新的线程执行myTimeConsumingProcess()函数。
- 用户被重定向到一个“处理中”页面。
- 使用布尔类型的Session变量,该页面无休止地刷新,直到前一页中留下的线程将Session变量切换为false。
到目前为止的代码:
DatabaseChecker.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;
}
Processing.aspx
每秒刷新一次页面:
<meta http-equiv="refresh" content="1" />
Processing.aspx.cs
在这个页面上保持不动,每1秒刷新一次,直到线程(留在DatabaseChecker.aspx.cs中)将会话变量“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");
}
}
我想要但是无法实现的:
如果可能的话,我想避免重定向到另一个页面,而是只更新在点击按钮的页面中的文本框。我尝试使用 QueryString 重定向到同一页面以指示我在进程中的位置。然而,这并不起作用 --- 到达重定向到同一页面的代码,并且文本已经更新,但是似乎没有发生任何事情,直到进程完成(这使线程失去了意义)。
我尝试了我能想到的每种替代方法,包括 UpdatePanel
、Timer
、PageAsyncTask
控件,以及几乎所有我能想到的通过将这些控件与线程结合使用,并将 .aspx 页面的 Async 属性设置为 true 的组合。