C# 在其他线程工作时刷新页面

C# 在其他线程工作时刷新页面,c#,asp.net,multithreading,asynchronous,webforms,C#,Asp.net,Multithreading,Asynchronous,Webforms,我的目标: 用户点击按钮 按钮开始myTimeConsumingProcess() 同一页面中的文本框每秒更新一次并添加“.”,直到过程完成 我拥有的(这很有效,但不是我想要的): 用户单击开始myTimeConsumingProcess()的按钮 新线程执行myTimeConsumingProcess() 用户被重定向到“处理”页面 使用一个布尔会话变量,此页将不断刷新,直到上一页中剩余的线程将会话变量切换为false 到目前为止的代码: DatabaseChecker.aspx.cs pro

我的目标:

  • 用户点击按钮
  • 按钮开始myTimeConsumingProcess()
  • 同一页面中的文本框每秒更新一次并添加“.”,直到过程完成
  • 我拥有的(这很有效,但不是我想要的):

  • 用户单击开始myTimeConsumingProcess()的按钮
  • 新线程执行myTimeConsumingProcess()
  • 用户被重定向到“处理”页面
  • 使用一个布尔会话变量,此页将不断刷新,直到上一页中剩余的线程将会话变量切换为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;
    }
    

    处理。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">&nbsp;</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);