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

时间:2016-10-31 18:23:33

标签: c# asynchronous webforms async-await

我有一个Asp.Net 4.5 webforms应用程序,其中包含我正在尝试使用async await运行的报告。以下是我正在使用的代码示例:

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完成时,我会得到一个未处理的异常,没有任何特定信息。请让我知道我在这里不理解。

1 个答案:

答案 0 :(得分:0)

我有类似的问题要求。解决了没有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>