获取唯一的线程ID

3
我需要将实际的用户线程ID写入日志文件。如果我使用Thread.CurrentThread.ManagedThreadId,我将得到相同的ID而不是唯一的ID。
原因是跟踪系统中用户的log.Info,并且以后如果我遇到问题,我将能够在日志中搜索 WHERE threadId = ? 并获取整个活动流。
我不介意在log4net代码内部获取它。
我说的是服务器线程,而不是手动线程。

ManagedThreadId 应该在托管线程中是唯一的。您确定没有使用来自线程池的可重用线程吗? - Vlad
@Vlad,谢谢,正如我之前所写的,这些不是手动线程,我说的是ASP.NET自动线程。 - SexyMF
3
你正在了解 asp.net 的工作原理,实际上它是同一个线程处理多个请求。你需要寻找其他东西来记录日志,也许是与会话相关的内容。 - Hans Passant
2个回答

4
这是不可能的,因为你在ASP.NET/IIS中的线程运行在IIS的线程池上……甚至不能保证HTTP请求完全在同一个线程上运行(例如,如果有一些I/O操作,它可能“休眠”并被重新分配到池中的另一个线程)……

那么确切的目标是什么?也许有其他方法可以实现...

编辑 - 根据评论:

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

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

如果你想跟踪会话,这完全取决于你的会话管理(无论是隐藏的HTML表单字段,cookie,用户还是其他什么...)。


嗨 - 对我来说不是很清楚,你是想跟踪一个HTTP请求还是整个会话? - Yahia
如果您能提供一个同时获取两者的示例,那将非常好。如果不能,无论您能提供什么都可以,谢谢。 - SexyMF

3
您最初的假设是不准确的: "实际线程" 会被反复重用,这就是为什么您一遍又一遍地得到相同的线程 ID。
您的错误在于假设每个请求都将由单独的线程处理。ManagedThreadId 的工作正常。
现在让我们来看看您想要做什么:
原因是要跟踪用户在系统中的 log.Info。
所以您想要跟踪与 用户 的交互。不是线程,而是用户。同一个用户可能在多个线程上进行交互,多个用户也可能使用同一个线程... 因此,您要记录的是用户 ID,而不是线程 ID。

谢谢,那么我了解了我的假设存在什么问题,我该如何跟踪HTTP请求或会话?谢谢。 - SexyMF
@SexyMF:为什么不记录用户ID? 请注意,即使在单个请求中,线程灵活性也意味着同一请求的不同部分可以在不同的线程上处理。 - Jon Skeet
@SexyMF:啊,标题里是的。把它放在标签和正文中会更有用,而不是标题中。不过我会把那一部分编辑掉... - Jon Skeet
1
好的,用户实际上没有登录,因此没有会话,也许我可以跟踪HTTP请求,你能提供一个例子吗? - SexyMF
@SexyMF: 你可以为每个会话自己分配一个唯一的标识符 - 我不知道框架中是否自动提供任何东西。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接