首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET核心会话实现线程安全吗?

ASP.NET核心会话实现线程安全吗?
EN

Stack Overflow用户
提问于 2019-05-24 07:31:25
回答 1查看 955关注 0票数 1

我知道有一个类似的问题,但这是关于ASP.NET的,而不是ASP.NET核心的。答案是7-9岁,把ASP.NET和ASP.NET核心混为一谈可能不是个好主意。

我指的是线程安全在本例中:

在属于同一会话的多个请求中使用Session的读写方法(比如Session)(通过HttpContext访问,通过注入的IHttpContextAccessor访问)安全吗?

显然答案是肯定的,因为如果不安全,那么所有开发人员都应该使他们访问代码线程的会话安全.

我查看了源代码,它似乎是默认的(我在调试器中访问的会话是DistributedSession的一个实例),没有任何序列化或其他技术的痕迹,比如锁.即使是私人_store成员也是纯Dictionary.

对于并发修改的使用,这个线程如何是安全的?我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 12:37:29

DistributedSession是由DistributedSessionStore (即注册为临时依赖项 )创建的。这意味着DistributedSessionStore本身是隐式安全的,因为它实际上不是在请求之间共享的。

会话使用字典作为基础数据源,该数据源也是DistributedSession对象的本地数据源。初始化会话时,会话在访问会话时惰性地初始化_store字典,方法是反序列化缓存中存储的数据。看上去像这样

代码语言:javascript
复制
var data = _cache.Get(_sessionKey);
if (data != null)
{
    Deserialize(new MemoryStream(data));
}

所以这里对_cache的访问是一个单一的操作。同样的情况也适用于写入缓存

至于IDistributedCache实现,您通常可以期望它们是线程安全的,以允许并行访问。例如,MemoryCache使用作为备份存储的并发集合。

所有这些对于并发请求的意义基本上是,您不应该期望一个请求直接影响另一个请求的会话。会话通常只反序列化一次,因此在请求期间发生的更新(由其他请求进行)不会出现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56287806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档