gpt4 book ai didi

c# - 在不同的线程工作时刷新页面

转载 作者:行者123 更新时间:2023-11-30 17:58:48 25 4
gpt4 key购买 nike

我的目标:

  1. 用户点击按钮
  2. 按钮开始 myTimeConsumingProcess()
  3. 同一页面中的 TextBox 每秒更新一次并添加一个“.”,直到该过程完成。

我有什么(这行得通,但不是我想要的):

  1. 用户单击开始 myTimeConsumingProcess() 的按钮按钮
  2. 一个新线程执行 myTimeConsumingProcess()
  3. 用户被重定向到“处理中”页面
  4. 使用 bool 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 中)将 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 重定向到同一页面以指示我在流程中的位置。但是,这不起作用 --- 到达了重定向到同一页面的代码,并且更新了文本,但是在该过程完成之前似乎没有任何反应(这违背了线程的目的)。

我已经尝试了所有我能想到的替代方案,包括 UpdatePanelTimer PageAsyncTask 控件,以及几乎所有我能想到的组合将这些控件与线程结合使用,并将 .aspx 页面的 Async 属性设置为 true。

最佳答案

您是否尝试过使用 AJAX。

当他们单击按钮时触发 AJAX 函数,这会启动您的耗时过程。

然后使用 AJAX 轮询页面的进度。


添加了一些代码来解释我过去是如何做到这一点的。

我不确定你是否真的需要一个更新面板,但我有一个。

这是我拥有的一些剪裁的代码片段,我相信它们可以满足您的需求。原始代码处理图像,并向用户显示进度条。

我在项目中引用了 AjaxControlToolkit 和 Ajax。

http://ajaxcontroltoolkit.codeplex.com/

这会将脚本管理器添加到页面

<ajaxToolkit:ToolkitScriptManager runat="server" ID="scriptManageer" EnablePartialRendering="true" AsyncPostBackTimeout="900" />

这是页面的“重要”部分。

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="message">&nbsp;</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 + "%"
}
}

由于剪切和粘贴,它可能有一些不需要但不应该阻止它工作的东西。

关于c# - 在不同的线程工作时刷新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com