获取唯一的线程ID
我需要将实际的用户线程ID写入日志文件。如果我使用Thread.CurrentThread.ManagedThreadId
,我没有得到唯一的ID,但一次又一次地得到相同的ID。获取唯一的线程ID
的原因是跟踪log.Info
横跨整个系统的用户,以后如果我看到一个问题,我就可以在日志中WHERE threadId = ?
进行搜索,并从记录整个活动流程。
我不介意让它在log4net的代码里面。
我说的是服务器线程而不是手动线程。
这是不可能的,因为您的ASP.NET/IIS中的线程正在IIS的线程池上运行......它甚至不能保证HTTP请求在同一线程上完全运行(例如,如果有一些I/O操作,它可以“去睡觉”并被重新分配给池中的另一个线程)...
目标是什么?也许有一些其他的方式来实现这一目标?
编辑 - 按评论:
要跟踪你可以尝试登录该请求的哈希码(通过GetHashCode()
访问)和请求/或者记录http请求对象的一些属性/字段的值的组合的哈希...
如果你深入挖掘,你可以得到一个工作请求对象,它有一个(请求特定的) TraceID
财产...
如果您想跟踪完全取决于您的会话管理的会话(无论是隐藏的HTML表单字段和/或cookie和/或用户和/或其他东西)。
你原来的假设是不准确的:“实际的线程”被重复使用,这就是为什么你一次又一次得到相同的线程ID。
你的错误是假定每个请求都将由一个单独的线程处理。 ManagedThreadId
工作正常。
现在让我们来看看你想要做什么:
的原因是为了跨越
所以你要跟踪与交互系统跟踪log.Info用户用户。不是线程,用户。同一个用户可能在多个线程上有交互,并且多个用户可能使用相同的线程...所以你想要记录的是用户ID,而不是线程ID。
'ManagedThreadId'是为了在托管线程中唯一。你确定你没有使用线程池中的可重用线程吗? – Vlad
@Vlad,正如我上面写的,这些都不是手动线程,我正在谈论ASP.NET自动线程 – SexyMF
那么,你会发现asp.net是如何工作的,它实际上是处理多个请求的同一个线程。你需要寻找其他东西来记录。可能会有相关的会话。 –