【发布时间】:2012-01-04 16:31:04
【问题描述】:
我在 ASP.net MVC 中使用异步控制器只是为了看看它们是如何工作的。在我的一个异步操作方法中,我想通过循环几次并执行 Thread.Sleep 来模拟一个长时间运行的方法:
for(int x = 1; x <= 10; x++) {
Thread.Sleep(1000);
Session["progress"] = x * 10;
}
我想要一种快速而肮脏的方式来报告长时间运行的操作的进度,所以我只使用了会话状态。我不会在普通应用程序中使用它,但我注意到在另一个非异步操作方法中,此会话状态没有被持久化:
public ActionResult ReportProgress() {
int progress = 0;
if( Session["progress"] != null ) {
progress = (int)Session["progress"];
}
return Json(progress);
}
在 ReportProgress 方法中,此会话变量始终为空。当我调试另一个异步方法时,会话正在被持久化。
有人知道为什么异步方法和同步方法似乎没有相同的会话吗?
【问题讨论】:
-
我在问题中明确表示我不会在普通应用程序中使用 Session,但我想要一种快速而肮脏的方式来报告进度。我只是好奇为什么它不起作用。
-
在 AsyncController 中 HTTPContext.Session 将被锁定,您可能需要使用 HttpContext.Application 作为解决方法!
标签: c# asp.net-mvc asynchronous