从Async按钮单击更新TextBox中的文本

时间:2015-01-22 04:23:59

标签: asynchronous webforms

我有一个需要很长时间才能完成执行的过程,用户应该能够在过程开始和结束时看到简单的反馈 像这样的东西:

    protected async void Button1_Click(object sender, EventArgs e)
    {
        TextBox1.Text = "Process started..\n";
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        await ProcessDelay();

        sw.Stop();

        TextBox1.Text += "Process finished.\n";
        TextBox1.Text += "Elapsed Time (ms): " + sw.ElapsedMilliseconds.ToString() + "\n";
    }

    private async Task ProcessDelay()
    {
        await Task.Delay(5000);
    }

在执行ProcessDelay()之前,TextBox中的文本值不会更新。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

请记住,当您使用ASP.NET时,您正在严格的请求+响应范例中工作。 WebForms尝试向您隐藏此信息,但它仍然是针对每个请求的一个响应。因此,当您单击浏览器中的按钮时,它会向Web服务器发送请求,该服务器会执行单击代码并返回结果。它只能返回一个结果。因此,它无法对页面的某个部分进行更改,然后再进行其他更改。

换句话说,ASP.NET上的async会产生ASP.NET运行时(也就是说,它会将请求线程返回给线程池)。它屈服于浏览器(也就是说,它不会返回响应)。

要做你想做的事,你需要一种替代技术。如果后台工作时间不长,您可以考虑使用SignalR。否则,您可能需要一个适当的分布式架构:连接到独立后台进程的可靠队列。我描述了一些方法on my blog