获取唯一的线程ID

时间:2011-09-25 11:50:51

标签: c# asp.net multithreading logging

我需要将实际的用户线程ID写入日志文件。如果我使用Thread.CurrentThread.ManagedThreadId,我不会一次又一次地获得唯一ID,而是一遍又一遍。

原因是在整个系统中跟踪用户log.Info,稍后如果我发现问题,我将能够在日志WHERE threadId = ?中搜索并从中获取整个活动流日志中。

我不介意把它放在log4net的代码中。

我说的是服务器线程,而不是手动线程。

2 个答案:

答案 0 :(得分:4)

这是不可能的,因为ASP.NET / IIS中的线程正在IIS的线程池上运行...甚至不能保证HTTP请求在同一个线程上完全运行(例如,如果有一些我/ O操作它可以“进入睡眠状态”并从池中重新分配给另一个线程... ...

目标究竟是什么?也许还有其他方法可以实现这一目标......

编辑 - 根据评论:

要跟踪请求,您可以尝试记录该请求的哈希码(可通过GetHashCode()访问)和/或记录http请求对象的某些属性/字段的值组合的哈希值......

如果你深入挖掘,你可以得到一个工人请求对象,该对象具有(请求特定的)TraceID属性......

如果您想跟踪完全取决于您的会话管理的会话(无论是隐藏的html表单字段和/或cookie和/或用户和/或其他内容......)。

答案 1 :(得分:3)

您的原始假设不准确:“实际线程”会一次又一次地重复使用,这就是您一次又一次获得相同线程ID的原因。

您的错误是假设每个请求都将由一个单独的线程处理。 ManagedThreadId工作正常。

现在让我们来看看你想要做什么:

  

原因是在整个系统中跟踪用户的log.Info

因此,您希望跟踪与用户的互动。不是线程,用户。同一个用户可能在多个线程上进行交互,并且多个用户可能使用相同的线程...所以您要记录的是用户 ID,而不是线程ID。