gpt4 book ai didi

.net - 使用并发线程跟踪操作

转载 作者:行者123 更新时间:2023-12-02 12:10:31 25 4
gpt4 key购买 nike

在 MSDN 中我发现了一个article关于如何将一些跟踪分配给特定操作。在 Microsoft 服务跟踪查看器中检查跟踪日志时,这会派上用场,因为您可以单击某个事件来查看该特定操作的情况。

以下是文章中的代码示例,说明如何将某些跟踪事件分配给操作:

Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

问题是:CorrelationManager 是静态的,因此会影响整个应用程序。您在多线程应用程序中做什么?不幸的是,我找不到完成多个并行事件的方法。

最佳答案

跟踪是静态的。但是,CorrelationManager 以线程本地存储的形式存储 ActivityId 和 LogicalOperationStack。 CorrelationManager 使用 CallContext.LogicalSetData 将值存储在 CallContext 中。

这意味着每个线程都可以有自己的ActivityId和LogicalOperationStack。

在伪代码中,Trace.CorrelationManager 和 CorrelationManager.ActivityId 的实现如下所示:

public static class Trace
{
private static correlationManager = null;
public CorrelationManager CorrelationManager
{
get
{
if (correlationManager == null) correlationManager = new CorrelationManager();
return correlationManager;
}
}
}


public class CorrelationManager
{
public Guid ActivityId
{
get
{
object id = CallContext.LogicalGetData("CorelationManager.ActivityId");
if (id == null)
{
return Guid.Empty;
}
return (Guid) id;
}
set
{
CallContext.LogicalSetData("CorrelationManager.ActivityId", value);
}
}
}

正如您所看到的,只有一个 Trace“对象”(因为它是静态的)并且只有一个 CorrelationManager(因为它是 Trace 对象上的一个属性,一个真实的对象实例)。上下文数据(ActivityId 和 LogicalOperationStack)的每线程实例是通过 CallContext 对象实现的。

通过 CallContext.LogicalSetData 存储的数据也会“流”到下游线程。因此,如果您在线程的开头设置 ActivityId,并且该线程随后生成线程(可能生成其他线程),那么所有这些下游线程都将具有相同的 ActivityId。

您可以在此处查看 Trace 和 CorrelationManager 的源代码(不确定它来自哪个版本的 .Net,但我怀疑它与现在 Trace 和 CorrelationManager 的工作方式非常接近:

Trace

CorrelationManager

关于.net - 使用并发线程跟踪操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7810011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com