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

时间:2017-08-13 09:07:52

标签: c# asp.net asynchronous webforms async-await

我对asynchwebform的使用感到困惑,我在asp.net服务器端为按钮创建了 onClick 函数,在这个函数中我创建了另一个函数函数是asynch并返回它的类型Task<int>,在这个函数的一边,我把Task.Run运行一些代码,我用它等待它,等待完成之后我想改变标签文本我的用户界面,但在完成等待后,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;
}

我知道不建议在Task.Run侧使用asynch,而我的代码没有用,但我想从中了解asynch函数的工作原理。< / p>

1 个答案:

答案 0 :(得分:3)

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

为了使其正常工作,必须将btn_click写为

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

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