C# 在其他线程工作时刷新页面
我的目标:C# 在其他线程工作时刷新页面,c#,asp.net,multithreading,asynchronous,webforms,C#,Asp.net,Multithreading,Asynchronous,Webforms,我的目标: 用户点击按钮 按钮开始myTimeConsumingProcess() 同一页面中的文本框每秒更新一次并添加“.”,直到过程完成 我拥有的(这很有效,但不是我想要的): 用户单击开始myTimeConsumingProcess()的按钮 新线程执行myTimeConsumingProcess() 用户被重定向到“处理”页面 使用一个布尔会话变量,此页将不断刷新,直到上一页中剩余的线程将会话变量切换为false 到目前为止的代码: DatabaseChecker.aspx.cs pro
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" />
我想要什么,我想不出来:
如果可能的话,我希望避免重定向到另一个页面,而只是更新单击按钮的页面中的文本框。我尝试使用查询字符串重定向到同一个页面,以指示我在该过程中的位置。但是,这不起作用——到达重定向到同一页面的代码,并更新文本,但是在过程完成之前似乎什么也没有发生(这违背了线程的目的)
我已经尝试了我能想到的每一种选择,包括
UpdatePanel
,Timer
PageAsyncTask
控件,以及通过将这些控件与线程结合使用,并将.aspx页面的Async属性设置为true,我几乎可以想到的每一种组合。您尝试过使用AJAX吗
当他们单击按钮时,会触发一个AJAX函数,从而启动耗时的过程
然后使用AJAX轮询页面的进度
添加了一些代码来解释我过去是如何做到这一点的 我不确定你是否需要一个更新面板,但我有一个 这是我的一些代码片段,我相信它能满足您的需求。 原始代码处理图像,并向用户显示进度条 我在项目中有AjaxControlToolkit和Ajax作为参考 这会将脚本管理器添加到页面中
<ajaxToolkit:ToolkitScriptManager runat="server" ID="scriptManageer" EnablePartialRendering="true" AsyncPostBackTimeout="900" />
由于剪切和粘贴,它可能有一些不需要的东西,但不应该阻止它工作。如果您设置
响应的第二个参数,则可能需要将重定向到true
,这样它就不会等待页面处理
public void Redirect(string url, bool endResponse);
正如我所说,我尝试过使用AJAX扩展控件计时器、UpdatePanel和UpdateProgress,但没有效果。我尝试过的最有希望的想法是将计时器设置为1秒,然后当进程在另一个线程中运行时,启用计时器并在每次运行时更新文本框,我非常自信它会工作,但它没有。这一切都发生在过程完成之后,而不是在过程中,即使它在自己的线程中关闭了。希望这会有帮助,我知道我以前做过这种事情。不幸的是,这没有效果。我不断地犯一些奇怪的错误,似乎是随机的。有时它会说,“对象已经移动到这里了”(这不是我的代码)并且“这里”链接到响应。重定向应该刚刚执行,有时它只是挂起,直到另一个线程中的进程完成。
<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>`
<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 + "%"
}
}
public void Redirect(string url, bool endResponse);