如何多线程“跨层”具有相关ID的单例而不锁定?

时间:2015-09-28 20:40:23

标签: c# multithreading locking singleton singleton-methods

因此,我们使用具有相关ID的公共状态上下文单例进行集中式日志记录。目的是在整个过程中跟踪id并关联不同的层。

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

当多线程发挥作用时,困难就出现了:

  1. 流程1已由用户1
  2. 解雇
  3. 相关ID设置为{1}
  4. DLL A访问状态上下文并获取相关ID {1}
  5. 在流程1完成之前,流程2已由用户2解雇
  6. 相关ID设置为{2}
  7. 来自第一进程访问状态上下文的DLL B,当它应为{1}
  8. 时,其相关标识为{2}

    我们如何解决这个问题?

    我们认为锁定不是我们的解决方案吗?还有其他想法吗?

    这是一张图

            (S)->[  CorrelationID {get;set}  ]                  
                   ^           ^            ^
        U1 <-->    |           |            |                 O  
        U2 <--> [DLLA] <-->  [DLLB] <-->  [DLLC]       <-->  | |
        U3 <-->         
                {Web}  <--> {Domain} <-> {Data Access} <--> {DB}
    
        (<--                 Process / Thread           -->    )  
    

    {} =可能的DLL示例

    每个用户的进程应具有1个相关ID

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

经过大量研究,我们找到了解决方案。

我们使用.Net Framework中的LogicalCallContext Class

所以LogicalCalContext类使用的是.Net Framework,它通过保留回调来保持池中的键值,即使它跳转线程。

Learn how to Flow Data across threads...

Approach for tying all NLog logs back to the original request within WebAPI

帖子中的评论引用了Serilog,所以你可能想看一下。