答案很简单:如果HttpContext.Current is null
因此,如果您需要修改会话,您就不能简单地修改会话,唯一的选择是制作完全自定义的会话模块/解决方案。
如果您只需要读取一些值,那么您可以在创建线程时传递它们。
最后,唯一的解决方案是如果您能够操作会话变量,则不要使用线程。
为什么这样设计?
为什么 MS 会话不允许您在页面之外和线程内处理它?答案是因为需要在页面处理上锁定会话数据——有了这个锁即使你启动一个线程并能够获取会话数据,也将无法并行使用它。
另外,如果你能够在一个线程中使用自己的session,那么这个线程可能会锁定整个页面视图过程,因为我再说一遍,session是锁定整个页面视图的,而使用同一个session的每个页面都不会锁定整个页面视图。并行工作
整个页面上的会话锁定对于 MS 会话的工作方式是必要的,避免这种情况的唯一方法是制作完全自定义的会话解决方案,并使用不同的代码处理特殊情况。
这种设计的好处是,您可以避免在每次页面调用时自行进行大量锁定和同步 - 例如,如果您禁用页面上的会话,并使用该页面进行数据插入,如果使用 make multiple double单击插入,并且您没有在插入上同步处理它,最终会得到多个相同的插入。
有关会话锁定的更多信息:
完全替换 ASP.Net 的会话 https://stackoverflow.com/questions/8989648/replacing-asp-nets-session-entirely/9021543#9021543
处理共享同一会话的另一个 Web 应用程序时 Web 应用程序被阻止 https://stackoverflow.com/questions/9426673/web-app-blocked-while-processing-another-web-app-on-sharing-same-session/9427550#9427550
jQuery Ajax 对 Web 服务的调用似乎是同步的 https://stackoverflow.com/questions/9052401/jquery-ajax-calls-to-web-service-seem-to-be-synchronous/9052457#9052457
ASP.NET 服务器不异步处理页面 https://stackoverflow.com/questions/12284530/asp-net-server-does-not-process-pages-asynchronously/12285168#12285168
类似问题:
如何在没有 HttpContext.Current 的情况下通过 SessionID 获取会话数据 https://stackoverflow.com/questions/2771536/how-to-get-session-data-with-out-having-httpcontext-current-by-sessionid