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多线程如何?
- asp.net-mvc-4 – 在EF迁移配置类的Seed方法中获取App_Data
- asp.net-mvc – 如何在Asp.net MVC 2中替换默认的ModelStat
- asp.net-mvc – 部署的ASP.NET MVC 4项目不会运行
- asp.net-mvc – 是否可以手动更新ModelState.IsValid?
- asp.net – 兼容模式下的IE9无法正确显示CSS样式
- asp.net – HTTP保持活跃在一个大的Web应用程序
- asp.net – 在IIS中将WebAPI添加为子/嵌套应用程序
- asp.net – 在使用预编译的Razor视图和VirtualPathProvider
- 如何在asp.net核心中使用ViewDataDictionary和Html.Partial
- asp.net-mvc-3 – ASP.NET MVC3项目并不总是发布
- asp.net-mvc – ASP.NET MVC中的代码
- asp.net-mvc – NLog在所有aspnet布局渲染器上抛
- 文件上传 – 以经典的asp上传文件
- asp.net-web-api – WebApi2属性路由404
- asp.net-mvc – ASP.NET MVC – Html.DropDownLi
- asp.net-mvc – 使用ASP.NET MVC响应HTTP HEAD请
- asp.net-mvc – ASP.NET MVC图像和其他静态内容u
- asp.net – 引用相同主键的两个外键
- asp.net – 要解决的JavaScript难题:window.con
