3

我的目标:

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

我所拥有的(这有效,但不是我想要的):

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

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

4

2 回答 2

1

您是否尝试过使用 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 + "%"
    }
}

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

于 2012-08-09T02:12:13.053 回答
0

也许如果您将第二个参数设置为Response.Redirectto true,则它不会等待页面处理。

public void Redirect(string url, bool endResponse);
于 2012-08-09T02:13:44.877 回答