Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 登录多线程异步代码_C#_Multithreading_Logging_Async Await - Fatal编程技术网

C# 登录多线程异步代码

C# 登录多线程异步代码,c#,multithreading,logging,async-await,C#,Multithreading,Logging,Async Await,我有一个异步处理的多线程应用程序(它本身使用许多线程)。如果没有异步,那么很容易记录并跟踪执行流,因为只需将当前线程标识符放入日志中,就可以看到哪个线程执行了哪个日志行 如何在异步环境中实现类似的功能?通常,在调用wait时,以下代码被分配给另一个线程(我对此没有意见,我相信线程池管理器会有效地为我完成这些分配)。问题是,我突然没有执行流的固定线程ID,很难将这两部分放在一起 在整个代码中是否有任务的标识符?我的意思是,假设一个方法中有5个等待调用。使用线程ID,我可以在日志中看到多达6个不同的

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

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

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


Task.Id或Task.CurrentId是否适合此用途,还是其他用途?

我认为“是否有可使用的现成标识符”的答案可能是否定的,但您可以使用,特别是,不仅仅是
SetData()
,例如,添加一个将在所有异步等待分叉之间流动的GUID。

您所指的是“相关id”,或者log4net所称的“嵌套诊断上下文”(NDC)。无论您拥有什么样的日志框架,都应该已经有一个,最有可能的是一个已经可以与
async
一起使用的日志框架


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

您只需为要创建的每个任务生成id(例如,使用自动增量)。不过,通过它(例如,
ContinueWith
)是另一个问题。我更想问的是,是否有一个可以使用的现成标识符。我知道它可以手动编程,但这实际上是我想要避免的。Task.Id是任务实例的标识符,但是如果你阅读本文,你会得到更多关于它的信息:使用Task.Id或CurrentId并没有给出代码/执行如何从一个任务流向另一个任务,是吗?Id的更改不会告诉您以前的Id是什么,除非总是只有一个实例在运行,并且没有并发性。