asp.net – 使用“async”(即使它应该完成)作为MVC路由的一部分
考虑以下(基于默认的MVC模板),这是在后台发生的一些“东西”的简化版本 – 它完好无损,并显示预期的结果20:
public ActionResult Index() { var task = SlowDouble(10); string result; if (task.Wait(2000)) { result = task.Result.ToString(); } else { result = "timeout"; } ViewBag.Message = result; return View(); } internal static Task<long> SlowDouble(long val) { TaskCompletionSource<long> result = new TaskCompletionSource<long>(); ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(50); result.SetResult(val * 2); }); return result.Task; } 然而,现在如果我们在混合中添加一些异步: public static async Task<long> IndirectSlowDouble(long val) { long result = await SlowDouble(val); return result; } 并将路由中的第一行更改为: var task = IndirectSlowDouble(10); 那么它不行;它代替了。如果我们添加断点,返回结果;在异步方法中只有在路由已经完成之后才会发生,基本上看起来系统不愿意使用任何线程恢复异步操作,直到请求完成。更糟:如果我们使用了.Wait()(或访问.Result),那么它将完全死锁。 那是什么呢?明显的解决方法是“不要异步”,但是在使用库时并不容易。最后,SlowDouble和IndirectSlowDouble之间没有任何功能上的区别(尽管有明显的结构差异)。 注意:在控制台/ winform / etc中完全相同的东西可以正常工作。 解决方法
这与ASP.NET(Pre .NET 4.5)中实现同步上下文的方式有关。关于这个行为有很多问题:
Task.WaitAll hanging with multiple awaitable tasks in ASP.NET Asp.net SynchronizationContext locks HttpApplication for async continuations? 在ASP.NET 4.5中,本文介绍了同步上下文的一个新实现。 http://blogs.msdn.com/b/webdev/archive/2012/11/19/all-about-httpruntime-targetframework.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 将Framework 4.5中的MVC项目降级为4.0
- ASP.Net错误:“类型”foo“存在于”temp1.dll“和”temp2.
- asp.net-mvc – 重启后浏览器不缓存资源
- asp.net – 将VS2012项目升级到VS2013网站,它不会让我指定I
- ASP.NET MVC another entity of the same type already has
- asp.net – 如何从vb.net中的日期时间中提取日期部分
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automap
- ASP.NET 常用 文件上传方法
- asp.net-mvc – Asp.net MVC中的TimeSpan和“24:00”解析错
- asp.net-mvc – Signalr从集线器外部调用特定客户端
- asp.net core 使用identityServer4的密码模式来进
- 我可以在ASP.NET中使用C#获取时间参数的本地化缩
- asp.net-mvc-3 – 在MVC中的Http Post之后渲染相
- 子文件夹中忽略ASP.NET web.config授权设置
- asp.net-mvc-3 – MVC绑定到带有列表属性的模型忽
- asp.net – 实现数据库对象的版本控制
- asp.net – SQL Azure不支持SqlCacheDependency?
- asp.net-mvc-3 – MVC 3使用修改的查询字符串值重
- asp.net-mvc – IdentityUserLogin不包含User的定
- asp.net – 在表单提交时禁用按钮