C# 等待后的代码在异步函数(webform)中未按预期工作

C# 等待后的代码在异步函数(webform)中未按预期工作,c#,asp.net,asynchronous,webforms,async-await,C#,Asp.net,Asynchronous,Webforms,Async Await,我对使用asynch和webform非常困惑,我在asp.net服务器端为按钮创建了onClick函数,在这个函数中,我创建了另一个函数,这个函数是asynch,并返回它的类型任务,在这个函数的旁边,我放置了Task.Run,它运行一些代码,我使用wait,在wait完成后,我想在我的UI中更改标签文本,但在完成wait之后,UI中没有任何事情发生 点击按钮代码: protected void btn_click(object sender , EventArgs e) { fun(); }

我对使用
asynch
webform
非常困惑,我在asp.net服务器端为按钮创建了onClick函数,在这个函数中,我创建了另一个函数,这个函数是
asynch
,并返回它的类型
任务
,在这个函数的旁边,我放置了
Task.Run
,它运行一些代码,我使用wait,在wait完成后,我想在我的UI中更改标签文本,但在完成wait之后,UI中没有任何事情发生

点击按钮代码:

protected void btn_click(object sender , EventArgs e)
{
  fun();
}
异步函数的代码:

public asynch Task<int> fun()
{
  Task<String> s = Task.Run(()=>someCodeTakeTime());
   await s;
   lable.Text = "finish";
   return 1;
}
公共异步任务fun()
{
Task s=Task.Run(()=>someCodeTakeTime());
等待;
lable.Text=“完成”;
返回1;
}

我知道不建议使用
任务。在
asynch
中运行
,我的代码不是有用的工作,但我想从中了解
asynch
函数是如何准确工作的。

处理函数btn_click()被定义为void。就ASP.NET而言,当此函数存在时,处理程序函数被视为已完成。ASP.NET将立即向浏览器发送响应。它不知道fun()中发生的任何事情,fun()实际上创建了一个任务并将其排队等待执行

为了使其工作,btn_click必须写为

protected async Task btn_click(object sender , EventArgs e)
{
  await fun();
}

任务的返回类型告诉ASP.Net它的执行结果将在任务中。您应该等待该任务完成,获取其结果,并根据结果向浏览器发送响应。

您还应该在事件处理程序中等待该任务,
wait fun()
。另请参见关于使用
RegisterAsyncTask