c# - 登录多线程异步代码

标签 c# multithreading logging async-await

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

如何在异步环境中实现类似的事情?通常,当调用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/

相关文章:

c# - 无法将类型 `bool' 隐式转换为 `UnityEngine.RaycastHit'

c# - 可排序的绑定(bind)列表<T> : confusion about RemoveSortCore

c++ - 我可以将 boost::threadpool 用作 'thread-safe queue' 吗?

Linux shell 脚本到 tar.gzip 日志文件超过 1 个月按月分组

java - 在 log4j 中使用 FileNamePattern、RollingFileAppender

windows - 确定哪个用户重新启动了 Windows 服务器

c# - Excel 进程仍在后台运行

我的 If 语句中的 C# 语法问题

android - 如何使用多个 AsyncTask 同步应用程序

objective-c - dispatch_async 自定义队列永远不会退出 block