繁体   English   中英

运行异步任务时如何立即更新UI

[英]How to update UI immediately when running an async task

我有一个带有报表的Asp.Net 4.5 Webforms应用程序,我正在尝试使用异步等待运行该报表。 这是我使用的代码示例:

protected async void btnReport_Click(object sender, EventArgs e)
{
    lblStatus.Text = "Working!";
    await LongRunningTask();
}

private async Task LongRunningTask()
{
    await Task.Delay(5000);
    lblStatus.Text = "Done!";
}

我读过的所有内容似乎都建议第一种方法应立即完成并更新标签,但事实并非如此。 该方法仍然绑定UI,直到LongRunningTask完成。 如果我从btnReport_Click中删除异步并等待,则UI会立即更新,但LongRunningTask完成时,我会得到未处理的异常,没有任何特定信息。 请让我知道我在这里不了解的内容。

我有类似的问题要求。 解决了没有ajax或JavaScript并使用4.5框架的问题。 以下是对可能阅读此书的人的一些建议:

•确保您的page.aspx声明具有以下内容: <%@ Page Title="" Async="true"

•确保您的按钮处理程序protected async void MyButton(object sender, EventArgs e)

•在我的情况下,虽然可能不是一个坏主意,但我没有使用更新面板。 基本示例代码:

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected async void Button1_Click(object sender, EventArgs e)
    {
        string s = await GetAsyncMethod1();
        Label1.Text = s;
        //Or call this 
        //string s = await GetAsyncMethod2(); 
    }


    private string GetDataFromDB()
    {
        return  "Heres your data...";
    }

    private Task<string> GetAsyncMethod1()
    {
        //dbLayer
       return Task.Run(() => GetDataFromDB());
    }

    public async Task<string> GetAsyncMethod2()
    {
        //Optional business Layer - more processing
        string complicated = "";
        complicated = await GetAsyncMethod1();
        return complicated;

    }

.... aspx标记:

<form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button"  OnClick="Button1_Click"/>
        <asp:Label ID="Label1" runat="server" Text="Label" />
    </div>
    </form>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM