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

问题描述 投票:0回答:1

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

c# asynchronous webforms async-await
1个回答
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>
© www.soinside.com 2019 - 2024. All rights reserved.