【问题标题】:Async Update Session Data异步更新会话数据
【发布时间】:2023-03-18 16:34:01
【问题描述】:

我发现几个答案抨击以异步方式使用会话状态,例如。

在某些情况下从异步线程更新会话将不会或无法工作?

我的用例如下:

在应用程序中,用户个人资料数据存储在会话中。旨在在管理员更改用户名、群组或其他个人资料信息等时异步刷新个人资料数据。

异步推力: 轮询存储数据已更改的用户 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
    }


}

在从异步任务写入会话数据时,是否还有其他注意事项或保护措施(除了空检查)?

【问题讨论】:

    标签: c# session asynchronous task-parallel-library


    【解决方案1】:

    Using Task.Factory.StartNew in ASP.NET is dangerous and may lead to unexpected behavior

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

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

    我强烈建议您考虑替代方案:

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

    2. 使用HostingEnvironment.QueueBackgroundWorkItem 或alternativley Stephans BackgroundTaskManager 注册与ASP.NET 线程池的工作。

    3. 考虑同步运行此代码

    您还应该阅读更多关于Returning Early From ASP.NET RequestsUsing Task.Run in a syncronous asp.net controller

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多