【发布时间】:2016-11-28 08:20:18
【问题描述】:
我在 ASP.NET WebForms 网站上有一个服务器端点击事件。在这种情况下,我调用一个方法,该方法又调用其异步伙伴方法,在调用中添加.Wait()。
然后,此方法会下降几个级别(即,调用另一个异步方法,该方法调用另一个异步方法,依此类推)并最终在 HttpClient 对象上调用一个异步方法。在这一点上,线程似乎消失在一个兔子洞里;该方法从不回调。
现在,我知道异步系列调用按预期工作,因为同样的代码也从 Web API 控制器调用(控制器方法调用第一个方法的异步版本,而不是同步“伙伴”方法),这是完全异步的,它按预期返回。
所以基本上我有这样的东西,它永远不会返回
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Class1.DoSomethingAsync.Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // never returns
}
我确实尝试在第一个异步方法上使用.ConfigureAwait(false),但没有任何成功。
我也有这个,确实返回
Task<IHttpActionResult> MyWebApiMethod()
> await Class1.DoSomethingAsync()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // does return
}
我发现如果我将第一个版本更改为以下内容,我可以使它工作:
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Task.Run(async () => await Class1.DoSomethingAsync()).Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync()
}
但我不知道为什么。
谁能解释一下调用的区别
Class1.DoSomethingAsync.Wait()
打电话
Task.Run(async () => await Class1.DoSomethingAsync()).Wait()
【问题讨论】:
-
何不以正确的方式使用它。
async void btn_Click和await Class1.DoSomethingAsync()? -
不要将
Task.Run与已经异步的方法一起使用,这是对线程的浪费。只需按照@user3185569 的建议更改button_clickeventhandler 的签名 -
@user3185569 - 我没有使用它,因为我不知道我可以在服务器端 WebForms 事件中使用
async。感谢您向我指出这一点。
标签: c# asp.net asynchronous async-await