如何 link ETW start/stop 操作码并发事件

How to link ETW start/stop Opcode concurrent events

我正在使用 ETW,并记录一些具有停止和停止操作码的事件,例如

[Event(1, Task = Tasks.ActivateTask, Opcode = EventOpcode.Start)]
public void ActivateTaskStart(string TaskName)
{
    if (IsEnabled())
    {
        WriteEvent(1, TaskName);
    }
}

[Event(2, Task = Tasks.ActivateTask, Opcode = EventOpcode.Stop)]
public void ActivateTaskStop(string TaskName)
{
    if (IsEnabled())
    {
        WriteEvent(2, TaskName);
    }
}

如果我有两个线程都在记录 ActivateTask start/stop 事件,我如何确保事件正确配对?例如如果我有:

然后

根据我对 ETW 文档的阅读,它默认假设 Stop 事件属于最近的、未配对的 Start 事件——但我想确保我链接的是正确的 Start/Stop事件。

这可能吗?如果是,怎么做?

为了使事情变得更复杂,启动和停止事件有可能来自不同的线程(如果需要,我应该能够使线程保持粘性)。

这叫做ActivityTrackig and works since .Net 4.6。要使其自动运行,您不能使用自己的 Thread 实现,您必须将所有调用包装到 System.Threading.Tasks.Task 调用中。