我正在编写一个Web应用程序,偶尔有一个过程运行几秒钟。在这种情况下,我需要更新页面以显示进程仍在运行。即数据库调用等,但是我似乎无法获得控件来更新多次。例如,每秒更新一次的标签,即阶段1,阶段2等(纯粹用于测试读取的代码是返回结果的存储过程)
我在页面上使用脚本管理器将控件包装在通常的“更新面板”中,我尝试将按钮控件作为触发器链接到更新面板,但是我只能显示最终结果。例如,我将使用相同的方法设置label.text =“ case 1”来测试1秒钟的延迟,然后再次更新标签。这在WPF之类的桌面c#环境中有效,但在ASP.NET中却没有aspx页面和后面的代码。
protected async void btnTakeTime_Click(object sender, EventArgs e)
{
//Button press we await each call which in turn lets the label
await TimeTaker(1);
await TimeTaker(2);
await TimeTaker(3);
await TimeTaker(4);
await TimeTaker(5);
}
private async Task<int> TimeTaker(int setting)
{
switch (setting)
{
case 1:
LabelInfo.Text = "case 1";
break;
case 2:
LabelInfo.Text = "case 2";
break;
case 3:
LabelInfo.Text = "case 3";
LabelInfo.CssClass = "text-info";
break;
case 4:
LabelInfo.Text = "case 4";
LabelInfo.CssClass = "text-warning";
break;
case 5:
LabelInfo.Text = "case 5";
LabelInfo.CssClass = "text-warning";
break;
}
//Delay the return so we have time to see the updated label on the web page.
await Task.Delay(1000);
return 1;
}
这纯粹是一个简单的示例,但是我希望在按下按钮时会调用该方法,它会更新标签,并且可以在屏幕上的更新面板中看到它。它确实达到了预期的断点,但是直到最终方法导致使用新的CSS类在标签上设置“案例5”的最终方法之后,标签才会更新。
答案 0 :(得分:0)
根据documentation,执行异步代码的唯一方法是使用页面异步任务。
尽管如此,btnTakeTime_Click
将在第一个阻塞等待(await Task.Delay(1000);
)之后返回。 LabelInfo
的状态取决于异步代码运行所需的时间以及页面执行(不知道该代码正在运行)所花费的时间。
此外,这些都没有改变HTTP(1.0 / 1.1)协议或Web窗体的工作方式,这是用户代理向服务器设置的请求,服务器将请求发回。无论LabelInfo
的状态在请求处理期间更改了多少次,它都只会具有最终状态。