更新面板使用异步方法将实时信息发送到标签或其他

时间:2019-06-07 10:58:18

标签: c# .net asynchronous async-await updatepanel

我正在编写一个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”的最终方法之后,标签才会更新。

1 个答案:

答案 0 :(得分:0)

根据documentation,执行异步代码的唯一方法是使用页面异步任务。

尽管如此,btnTakeTime_Click将在第一个阻塞等待(await Task.Delay(1000);)之后返回。 LabelInfo的状态取决于异步代码运行所需的时间以及页面执行(不知道该代码正在运行)所花费的时间。

此外,这些都没有改变HTTP(1.0 / 1.1)协议或Web窗体的工作方式,这是用户代理向服务器设置的请求,服务器将请求发回。无论LabelInfo的状态在请求处理期间更改了多少次,它都只会具有最终状态。