gpt4 book ai didi

c# - ASP.net MVC - AsyncController 和 Session

转载 作者:行者123 更新时间:2023-11-30 22:32:25 26 4
gpt4 key购买 nike

我在 ASP.net MVC 中尝试使用异步 Controller 只是为了看看它们是如何工作的。在我的一个异步操作方法中,我想通过循环几次并执行 Thread.Sleep 来模拟长时间运行的方法:

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

Session["progress"] = x * 10;
}

我想要一种快速而肮脏的方式来报告长时间运行的操作的进度,所以我只使用了 session 状态。我不会在普通应用程序中使用它,但我注意到在另一个非异步操作方法中,这个 session 状态没有被持久化:

public ActionResult ReportProgress() {
int progress = 0;

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

return Json(progress);
}

在 ReportProgress 方法中,此 session 变量始终为空。当我调试另一个异步方法时,Session 被持久化。

有没有人知道为什么异步方法和同步方法似乎没有相同的 session ?

最佳答案

这个链接应该给你一个想法:

Using an Asynchronous Controller in ASP.NET MVC (Working with the BeginMethod/EndMethod Pattern)

引用:

If an asynchronous action method calls a service that exposes methods by using the BeginMethod/EndMethod pattern, the callback method (that is, the method that is passed as the asynchronous callback parameter to the Begin method) might execute on a thread that is not under the control of ASP.NET. In that case, HttpContext.Current will be null, and the application might experience race conditions when it accesses members of the AsyncManager class such as Parameters. To make sure that you have access to the HttpContext.Current instance and to avoid the race condition, you can restore HttpContext.Current by calling Sync() from the callback method.

您想在这里做的是将结果传递给带有 AsyncManagaer.Paramater 字典的 Controller 操作的 xxxCompleted 方法,并在那里设置 session 。

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

但请记住,这种方法不是前进的方向。随着 await 关键字的可用性,ASP.NET MVC 上的异步操作将在下一个版本中发生巨大变化。

更多信息:

Task Support for Asynchronous Controllers

关于c# - ASP.net MVC - AsyncController 和 Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8730273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com