Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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#_Asp.net Core_.net Core - Fatal编程技术网

C# 如何使一段数据可用于调用堆栈下的其他函数?

C# 如何使一段数据可用于调用堆栈下的其他函数?,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,对于某些特定的日志记录需求,我想生成一个变量,可能是一个GUID,让我能够识别该函数。 然后,我想在调用堆栈的另一个函数中访问该变量,而不修改调用堆栈中原始函数的函数签名 这是可能的还是有意义的 上下文: 我正在生成一些日志,希望将调用者“链接”到这些日志 正在顺流调用的函数。在来电者中,我能够 编写一些日志或为当前函数分配一些特定ID。 然而,在调用堆栈中,我似乎可以访问任何 除了使用StackTrace的基本信息之外,来自“调用者”的信息 让我们想象一下,我有一些像这样的呼叫链 () =>B

对于某些特定的日志记录需求,我想生成一个变量,可能是一个GUID,让我能够识别该函数。 然后,我想在调用堆栈的另一个函数中访问该变量,而不修改调用堆栈中原始函数的函数签名

这是可能的还是有意义的

上下文:

我正在生成一些日志,希望将调用者“链接”到这些日志 正在顺流调用的函数。在来电者中,我能够 编写一些日志或为当前函数分配一些特定ID。 然而,在调用堆栈中,我似乎可以访问任何 除了使用StackTrace的基本信息之外,来自“调用者”的信息

让我们想象一下,我有一些像这样的呼叫链

()

=>B()

=>=>C()

我怎么知道C()的当前实例正在被特定的A()调用调用调用,而不将A()的GUID沿着调用堆栈传递给B()然后传递给C()

我做了一些研究,但结果似乎陈旧,不一定符合目前的情况了

好吧……作为评论:你在试图做一些不该做的事情。也就是说,您希望将一个值传递给被调用的函数,但不是通过使用推送到连续堆栈帧上的参数的常规方法

我不会就此做出判断,但它确实指向了一个可能的解决方案:您可以在代码中重新创建函数调用堆栈机制。换句话说,在每个方法中都有一个堆栈全局变量,并将方法名称和GUID推送到堆栈上。然后,在示例方法C中,您可以遍历堆栈以查找A的调用实例的GUID。假设您在多任务环境中工作,您可能还希望推送当前任务id和/或为每个线程或每个任务创建单独的堆栈


正如您所指出的,StackTrace.GetFrame(i)已经完成了这类工作,但它只提供了基本信息,比如方法的名称。然而,这仍然足够,取决于你的情况。例如,您可以一直走到堆栈跟踪的底部,以找到的所有活动实例以及它们的调用来源

看看可用的解决方案,这似乎是一个广泛使用的功能。对于NET标准,使用了
System.Runtime.Remoting.Messaging.CallContext

提供与执行代码路径一起携带的一组属性

对于.NET Core,
System.Threading.AsyncLocal
可用

表示给定异步控件的本地环境数据 流,例如异步方法

在中可以看到完整的实现


我们还可以从NLog中得到启发,NLog似乎利用上述两种解决方案在逻辑范围内实现全面的消息传递机制

为什么不能仅使用包含类的字段/属性来存储数据?NLog允许您使用映射的诊断逻辑上下文来实现这一点。我认为您可以使用,也许,但这是标记的.Net Core,我不太熟悉。在类级别创建GUID属性您需要访问它还是只用于日志,因为听起来您想要@ZaelinGoodman谢谢您的输入。我正在寻找一个解决方案,需要较少的变化在类。我不确定这是否适用于静态函数,加上类级别的GUID将在同一“对象”上的不同函数调用之间共享?你们都认为我目前的要求有意义吗/这是一个有趣的案例吗?谢谢你们的回答。我确信我正在尝试做的是非常不正常的。答案给了我一些有趣的想法。。。