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

时间:2012-08-09 02:03:40

标签: c# asp.net multithreading asynchronous webforms

我的目标:

  1. 用户点击按钮
  2. 按钮开始myTimeConsumingProcess()
  3. 同一页面中的TextBox每秒更新一次并添加“。”,直到该过程完成。
  4. 我拥有的(这有效,但不是我想要的):

    1. 用户点击按钮开始myTimeConsumingProcess()
    2. 的按钮
    3. 新线程执行myTimeConsumingProcess()
    4. 用户被重定向到“处理”页面
    5. 使用布尔会话变量,此页面会无休止地刷新,直到上一页中的线程将Session变量切换为false。
    6. 到目前为止的代码:

      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更新,但是在过程完成之前似乎没有任何事情发生(这违背了线程的目的)。

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

2 个答案:

答案 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">&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 + "%"
    }
}

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

答案 1 :(得分:0)

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

public void Redirect(string url, bool endResponse);
相关问题