我有一个具有异步处理功能的多线程应用程序(它本身使用许多线程)。如果没有异步,则可以很容易地记录并跟踪执行流程,因为只需将当前线程标识符放入日志中,这样您就可以看到哪个日志行是由哪个线程执行的。
如何在异步环境中实现类似的事情?通常,当调用await时,以下代码会被分配给另一个线程(我对此很满意,我相信线程池管理器会有效地为我完成这些分配)。问题是,我突然没有执行流的固定线程 ID,并且很难将这两部分放在一起。
整个代码中是否有保留任务的标识符?我的意思是,假设一个方法中有 5 次 wait 调用。通过线程 ID,我可以在日志中看到最多 6 个不同的 ID。我想要一件事,并且如果它已经存在的话我会更喜欢(我知道我可以创建一个对象并将其一遍又一遍地传递给我的日志函数,但如果已经有一些东西,那就更好了)。
Task.Id 或 Task.CurrentId 是否适合此目的,还是其他用途?
最佳答案
您指的是“相关 ID”,或者 log4net 所说的“嵌套诊断上下文”(NDC)。无论您拥有什么日志记录框架,都应该已经拥有一个,很可能已经与 async
一起使用。 .
如果您需要构建自己的 ID,我建议将一个 id(或不可变 id 堆栈)放入 AsyncLocal<T>
中。 (本质上是LogicalSetData
,但具有更易于使用和更便携的API)。请注意,异步上下文数据应该是不可变的。请参阅my blog了解更多信息。
关于c# - 登录多线程异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867023/