首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC 4异步子动作

ASP.NET MVC 4异步子动作
EN

Stack Overflow用户
提问于 2012-10-05 03:34:36
回答 2查看 12.4K关注 0票数 28

我有一个针对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子操作中有使用异步方法的方法吗?似乎是一个没有解决办法的平淡无奇的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-05 09:23:42

MVC中仍有一些部分不是async-friendly;我希望这些部分将在将来得到解决。请为此创建一个连接或UserVoice问题。

我的异步逻辑封装在类库中,所以我不能使用“等待blah.ConfigureAwait(false)”的技巧。

您可能应该将ConfigureAwait(false)添加到类库中的调用(如果可以的话)。

您还可以黑出另一个解决方案。如果您的类库方法不需要ASP.NET上下文,则可以让线程池线程执行(A)等待您的操作:

代码语言:javascript
复制
try
{
    var result = Task.Run(async () => { await MyHttpRequest(...); }).Result;
}
catch (AggregateException ex) { ... }

其效果类似于ConfigureAwait(false):由于MyHttpRequest在线程池上下文中运行,因此它在完成时不会尝试输入ASP.NET上下文。

票数 34
EN

Stack Overflow用户

发布于 2016-01-27 07:47:54

Stephen的答案的格式对我不太适用(也许这是一个异步noob问题,但是嘿)。

我必须以这种格式编写异步表达式才能获得强类型的返回值。

代码语言:javascript
复制
Person myPerson = Task.Run(() => asyncMethodWhichGetsPerson(id)).Result;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12739114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档