登录多线程异步代码

Wap*_*pac 2 c# logging multithreading async-await

我有一个带有异步处理的多线程应用程序(它本身使用许多线程)。如果没有异步,很容易记录并跟踪执行流程,因为只需将当前线程标识符放入日志中,您就可以看到哪个日志行由哪个线程执行。

如何在异步环境中实现类似的事情?通常在调用 await 时,以下代码会分配给另一个线程(我对此没有意见,我相信线程池管理器会有效地为我完成这些分配)。问题是,突然间我没有执行流程的这个固定线程 ID,很难将这两个部分放在一起。

是否有任何任务标识符会保留在整个代码中?我的意思是假设一个方法中有 5 次等待调用。使用线程 ID,我可以在日志中看到多达 6 个不同的 ID。我想要一件事,我更喜欢它已经存在(我知道我可以创建一个对象并将它一遍又一遍地传递给我的日志函数,但如果已经有了东西,那就更好了)。

Task.Id 或 Task.CurrentId 是否适合此目的,还是其他什么?

Ste*_*ary 5

您所指的是“相关性 ID”,或者 log4net 所称的“嵌套诊断上下文”(NDC)。无论您拥有什么日志框架,都应该已经有了一个,很可能已经与async.

如果您需要构建自己的,我建议将一个 id(或一个不可变的 id 堆栈)放入一个AsyncLocal<T>(本质上是LogicalSetData一个更易于使用和更便携的 API)。请注意,异步上下文数据应该是不可变的。有关更多信息,请参阅我的博客