如何实现多线程“跨层”具有不带锁的关联id的单例
本文关键字:id 关联 单例 何实现 实现 跨层 多线程 | 更新日期: 2023-09-27 18:14:51
所以我们使用一个带有相关ID的公共状态上下文单例来集中记录。目的是在整个过程中跟踪id并关联不同的层。
状态上下文由多个dll和多个用户访问。
当多线程开始发挥作用时,困难就来了:
- 进程1已被用户1触发
- 关联ID被设置为{1}
- DLL A访问状态上下文并获得关联ID {1}
- 在进程1完成之前,进程2已被用户2触发
- 关联ID被设置为{2}
- DLL B来自第一个进程访问状态上下文,关联id为{2},而它应该是{1}
我们如何解决这个问题?
我们不认为锁是我们的解决方案?还有其他想法吗?
这是一个图表
(S)->[ CorrelationID {get;set} ]
^ ^ ^
U1 <--> | | | O
U2 <--> [DLLA] <--> [DLLB] <--> [DLLC] <--> | |
U3 <-->
{Web} <--> {Domain} <-> {Data Access} <--> {DB}
(<-- Process / Thread --> )
{} =可能的dll示例
每个用户的进程应该有1个关联ID
可能是,ThreadLocal
经过一番研究,我们找到了解决办法。
我们在。net框架中使用LogicalCallContext类
所以LogicalCalContext类所做的是利用。net框架,它通过保留回调来保持键值在池中,即使它跳转线程。
学习如何跨线程流动数据…
将所有NLog日志绑定回WebAPI中原始请求的方法
文章中的评论也引用了Serilog,所以你可能想看看它