异步更新会话数据

本文关键字:数据 会话 更新 异步 | 更新日期: 2023-09-27 18:19:25

我找到了几个答案,抨击异步方式使用会话状态,例如

    异步设计中的session
  • 异步线程和会话

是否有一些条件下,从异步线程更新会话将不会或不能工作?

我的用例如下:

在app中,用户配置文件数据存储在会话中。当管理员更改用户名、组或其他配置文件信息等时,旨在异步刷新配置文件数据。

异步推力:轮询存储数据已更改的用户id的数据库表。如果数据匹配当前用户id,刷新配置文件数据,从表

中删除id

我发现下面的代码异步更新会话键。

public class MyAsyncUpdateController : Controller
{
    public static string MyKey = "myKey";
    public ActionResult Index()
    {
        Session[MyKey] = "Init Data: Updated at " + DateTime.Now.TimeOfDay;
        Task.Factory.StartNew(session =>
        {
            Thread.Sleep(10000);
            var _session = (HttpSessionState)session;
            if (_session != null)
                _session[MyKey] = "Async Data: Updated at " + DateTime.Now.TimeOfDay ;
        }, System.Web.HttpContext.Current.Session);
        return RedirectToAction("OtherAction");
    }
    public ActionResult OtherAction()
    {
        string result = "";
        if (Session != null && Session[MyKey] != null)
            result=  Session[MyKey].ToString();
        return Content(result);
       //Refresh until see updated timestamp
    }

}

当从异步任务写入会话数据时,除了null检查之外,还有什么其他的考虑因素或保护吗?

异步更新会话数据

在ASP中使用Task.Factory.StartNew。. NET是危险的,可能导致意想不到的行为

原因是ASP。. NET运行时不知道您已将此工作排队,因此它甚至不知道后台工作存在。由于各种原因,IIS/ASP。. NET必须偶尔回收您的应用程序。如果在此回收发生时正在运行后台工作,那么该工作将神秘地消失

而且,HttpContext.Current.Session不是线程安全的。当在同一个键上异步地使用多个请求时,可能会遇到竞争条件,导致无效数据。

我强烈建议你考虑其他选择:

  1. 使用持久队列(如Stephan在他的博客中建议的),如MSMQ或Azure MB。

  2. 使用HostingEnvironment.QueueBackgroundWorkItem或替代Stephans BackgroundTaskManager注册与ASP工作。净ThreadPool。

  3. 考虑同步运行此代码

你还应该阅读更多关于尽早从ASP返回的信息。. NET请求Using Task。在同步asp.net控制器中运行