如何实现多线程“跨层”具有不带锁的关联id的单例

本文关键字:id 关联 单例 何实现 实现 跨层 多线程 | 更新日期: 2023-09-27 18:14:51

所以我们使用一个带有相关ID的公共状态上下文单例来集中记录。目的是在整个过程中跟踪id并关联不同的层。

状态上下文由多个dll和多个用户访问。

当多线程开始发挥作用时,困难就来了:

  1. 进程1已被用户1触发
  2. 关联ID被设置为{1}
  3. DLL A访问状态上下文并获得关联ID {1}
  4. 在进程1完成之前,进程2已被用户2触发
  5. 关联ID被设置为{2}
  6. 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

如何实现多线程“跨层”具有不带锁的关联id的单例

可能是,ThreadLocal?https://msdn.microsoft.com/en-us/library/dd642243%28v=vs.100%29.aspx

经过一番研究,我们找到了解决办法。

我们在。net框架中使用LogicalCallContext类

所以LogicalCalContext类所做的是利用。net框架,它通过保留回调来保持键值在池中,即使它跳转线程。

学习如何跨线程流动数据…

将所有NLog日志绑定回WebAPI中原始请求的方法

文章中的评论也引用了Serilog,所以你可能想看看它