[英]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.