【发布时间】:2014-11-10 03:08:33
【问题描述】:
我正在调查 ASP.NET MVC 控制器方法的上下文中的 async 和 await,并且遇到了一些意外行为。
我有以下控制器类:
[SessionState(System.Web.SessionState.SessionStateBehavior.Required)]
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
public async Task<ActionResult> Check1()
{
Session["Test"] = "Check";
System.Diagnostics.Debug.WriteLine("Session: " + Session["Test"]);
await Task.Delay(20000);
return View();
}
public ActionResult Check2()
{
var test = Session["Test"];
ViewBag.Test = test;
return View();
}
}
每个方法 Check1 和 Check2 的简单视图:
检查1
@{
ViewBag.Title = "Check1";
}
<h2>View with Delay</h2>
检查2
@{
ViewBag.Title = "Check2";
var check = ViewBag.Test;
}
<h2>Immediate View @check</h2>
现在启动应用程序后,当我在一个选项卡中打开http://localhost:23131/Home/Check1 并在第二个选项卡中打开http://localhost:23131/Home/Check2 时,对Check1 的调用按预期在20 秒后返回,并且对Check2 的调用立即返回,但是它没有在会话状态中设置值,我不明白为什么。它应该立即设置,因为它在延迟之前。但是,正确的值会打印在输出窗口上。
现在 Check1 返回后,在Check2 选项卡上点击刷新会从viewbag 中的会话中获取值并显示它。
此后,如果我再次刷新两个选项卡,Check2 在 Check1 完成后不会返回(延迟 20 秒),尽管 Check2 是 async。
我的问题是:
- 第一次打开两个选项卡时,
Check2立即返回,因为Check1是async,尽管SessionStateBehavior.Required没有阻止它,因为await语句返回控制直到等待的任务完成。为什么Check2没有在Check1返回之前获取值? - 第一次之后,
Check2卡住了,直到Check1返回,尽管Check1是async,这是为什么呢?重新运行应用程序后,Check1会立即返回,如上一个问题所述,但仅返回一次。 - 我的解释中有没有遗漏或陈述错误的概念。
将 ASP.NET 与 .NET Framework 4.5 结合使用,Visual Studio 2013 在 Windows 7 Ultimate 上运行。
【问题讨论】:
-
在你的 web.config 中,
httpRuntime.targetFramework的值是多少? -
httpRuntime targetFramework="4.5"
标签: c# asp.net session async-await asp.net-4.5