我有一个针对ASP.NET 4.5的.NET MVC 4应用程序。我们的一个子操作使用HttpClient调用web服务。
由于我们阻塞了等待HttpClient响应的IO,所以将代码转换为异步/等待模式非常有意义。但是,当MVC 4试图执行子操作时,我们会得到以下错误消息:
HttpServerUtility.Execute在等待异步操作完成时被阻塞。
乍一看,似乎MVC 4不支持子操作中的异步/等待。剩下的唯一选项是使用同步代码运行,并强制对异步任务进行“等待”。
众所周知,在异步任务上触摸.Result或.Wait()将导致ASP.NET上下文中的即时死锁。我的异步逻辑封装在类库中,所以我不能使用“等待blah.ConfigureAwait(false)”的技巧。请记住,在子操作上标记“异步”并使用“等待”会导致错误,这会阻止我配置等待。
我现在被画到了墙角。在MVC 4子操作中有使用异步方法的方法吗?似乎是一个没有解决办法的平淡无奇的错误。
发布于 2012-10-05 09:23:42
MVC中仍有一些部分不是async-friendly;我希望这些部分将在将来得到解决。请为此创建一个连接或UserVoice问题。
我的异步逻辑封装在类库中,所以我不能使用“等待blah.ConfigureAwait(false)”的技巧。
您可能应该将ConfigureAwait(false)添加到类库中的调用(如果可以的话)。
您还可以黑出另一个解决方案。如果您的类库方法不需要ASP.NET上下文,则可以让线程池线程执行(A)等待您的操作:
try
{
var result = Task.Run(async () => { await MyHttpRequest(...); }).Result;
}
catch (AggregateException ex) { ... }其效果类似于ConfigureAwait(false):由于MyHttpRequest在线程池上下文中运行,因此它在完成时不会尝试输入ASP.NET上下文。
发布于 2016-01-27 07:47:54
Stephen的答案的格式对我不太适用(也许这是一个异步noob问题,但是嘿)。
我必须以这种格式编写异步表达式才能获得强类型的返回值。
Person myPerson = Task.Run(() => asyncMethodWhichGetsPerson(id)).Result;https://stackoverflow.com/questions/12739114
复制相似问题