我有一个需要很长时间才能完成执行的过程,用户应该能够在过程开始和结束时看到简单的反馈 像这样的东西:
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中的文本值不会更新。我在这里缺少什么?
答案 0 :(得分:1)
请记住,当您使用ASP.NET时,您正在严格的请求+响应范例中工作。 WebForms尝试向您隐藏此信息,但它仍然是针对每个请求的一个响应。因此,当您单击浏览器中的按钮时,它会向Web服务器发送请求,该服务器会执行单击代码并返回结果。它只能返回一个结果。因此,它无法对页面的某个部分进行更改,然后再进行其他更改。
换句话说,ASP.NET上的async
会产生ASP.NET运行时(也就是说,它会将请求线程返回给线程池)。它不屈服于浏览器(也就是说,它不会返回响应)。
要做你想做的事,你需要一种替代技术。如果后台工作时间不长,您可以考虑使用SignalR。否则,您可能需要一个适当的分布式架构:连接到独立后台进程的可靠队列。我描述了一些方法on my blog。