Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net MVC-异步控制器和会话_C#_Asp.net Mvc_Asynchronous - Fatal编程技术网

C# ASP.net MVC-异步控制器和会话

C# ASP.net MVC-异步控制器和会话,c#,asp.net-mvc,asynchronous,C#,Asp.net Mvc,Asynchronous,我在ASP.NETMVC中使用异步控制器只是为了看看它们是如何工作的。在我的一个异步操作方法中,我希望通过循环几次并执行线程来模拟长时间运行的方法。睡眠: for(int x = 1; x <= 10; x++) { Thread.Sleep(1000); Session["progress"] = x * 10; } 在ReportProgress方法中,此会话变量始终为null。当我调试另一个异步方法时,会话被持久化 有人知道为什么异步方法和同步方法不具有相同的会话

我在ASP.NETMVC中使用异步控制器只是为了看看它们是如何工作的。在我的一个异步操作方法中,我希望通过循环几次并执行线程来模拟长时间运行的方法。睡眠:

for(int x = 1; x <= 10; x++) {
    Thread.Sleep(1000);

    Session["progress"] = x * 10;
}
在ReportProgress方法中,此会话变量始终为null。当我调试另一个异步方法时,会话被持久化


有人知道为什么异步方法和同步方法不具有相同的会话吗?

此链接应该能让您了解:

引述:

如果异步操作方法调用公开方法的服务 通过使用BeginMethod/EndMethod模式,回调方法 是作为异步回调参数传递的方法 对于Begin方法),可能会在不在 ASP.NET的控件。在这种情况下,HttpContext.Current将为空, 应用程序在访问时可能会遇到竞争条件 AsyncManager类的成员,例如参数。确定 您有权访问HttpContext.Current实例并避免 在竞争条件下,您可以通过调用 来自回调方法的Sync()

这里要做的是使用
AsyncManagaer.Paramater
字典将结果传递给控制器操作的
xxxCompleted
方法,并在那里设置会话

您在
xxxCompleted
方法中是安全的。请参阅我提供的链接。它将引导您完成整个过程

但请记住,这种方法不是前进的方向。ASP.NET MVC上的异步操作将在下一个版本中发生巨大变化,因为有了
wait
关键字

更多信息:


不要使用会话!我在问题中明确表示,我不会在普通应用程序中使用Session,但我想要一种快速而肮脏的方式来报告进度。我只是好奇它为什么不起作用。也许这篇文章可以帮上忙:在AsyncController HTTPContext中。会话将被锁定,您可能需要使用HTTPContext.Application作为解决方法!我的HttpContext.Current不为null。它只是在会话变量中没有任何内容。会话、上下文、请求响应等在asp.net请求的边界之外不可用。
public ActionResult ReportProgress() {
    int progress = 0;

    if( Session["progress"] != null ) {
        progress = (int)Session["progress"];
    }

    return Json(progress);
}