我的目标:
我拥有的(这有效,但不是我想要的):
到目前为止的代码:
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中保留)将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重定向到同一页面,以指示我在这个过程中的位置。但是,这不起作用---重定向到同一页面的代码IS,文本IS更新,但是在过程完成之前似乎没有任何事情发生(这违背了线程的目的)。
我已经尝试了我能想到的所有替代方案,包括UpdatePanel
,Timer
PageAsyncTask
控件,以及我可以通过将这些控件与Threads结合使用来实现的几乎所有组合,以及将.aspx页面的Async属性设置为true。
答案 0 :(得分:1)
您是否尝试过使用AJAX。
当他们点击按钮触发AJAX功能时,会启动耗时的过程。
然后使用AJAX轮询页面以获取进度。
添加了一些代码来解释我过去是如何做到的。
我实际上不确定你是否需要更新面板,但我有一个。
这是我所拥有的一些我认为你想要的代码。 原始代码处理了图像,并向用户显示了进度条。
我在项目中使用AjaxControlToolkit和Ajax作为参考。
http://ajaxcontroltoolkit.codeplex.com/
这会将脚本管理器添加到页面
<ajaxToolkit:ToolkitScriptManager runat="server" ID="scriptManageer" EnablePartialRendering="true" AsyncPostBackTimeout="900" />
这是&#34;重要&#34;页面的一部分。
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="message"> </div>
<button id="btnSave" class="saveButton" onclick="doSomething();return false;">Save</button>
</ContentTemplate>
</asp:UpdatePanel>`
这个javascript使投票工作。
<script type="text/javascript">
function startPoll()
{
Default.DoThing();
myInterval = setInterval("poll()", 1000); //If you really want to poll that often
}
function poll()
{
progress = Default.ThingProcess();
if (progress == "100%")
{
clearInterval(myInterval);
}
document.getElemenyById("message").innerHTML = progress;
}
</script>
这是我的代码隐藏。
public partial class Default : System.Web.UI.Page
{
protected void Page_load(object sender, EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(Default));
}
[Ajax.AjaxMethod]
public void DoThing()
{
Thread thread = new Thread(new ThreadStart(MyTimeConsumingProcess));
thread.Start();
//The MyTimeConsumingProcess updates a var for thing progess
}
[Ajax.AjaxMethod]
private String ThingProgress()
{
//Reads some var
return progressNumber + "%"
}
}
由于切割和粘贴,可能会有一些不需要但不应该停止工作的东西。
答案 1 :(得分:0)
也许如果您将Response.Redirect
的第二个参数设置为true
,那么它就不会等待页面处理。
public void Redirect(string url, bool endResponse);