Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# EventSource活动id和TPL_C#_Task Parallel Library_Etw - Fatal编程技术网

C# EventSource活动id和TPL

C# EventSource活动id和TPL,c#,task-parallel-library,etw,C#,Task Parallel Library,Etw,根据文件,当前活动id应由TPL处理。但是当我得到结果时,来自不同任务的日志事件属于不同的活动。 为了读取消息,我使用进程外语义阻塞svc.2.0.1406.1 工作流程如下: 1.我设置了活动id,应该使用它。EventSource.SetCurrentThreadActivityId. 2.然后我在同一个线程中有一些代码,但也可以在不同的线程中有很多代码。示例(来自以下任务的日志消息记录为不同的活动ID): Events.Current.TestMethod3(); Task.WaitAl

根据文件,当前活动id应由TPL处理。但是当我得到结果时,来自不同任务的日志事件属于不同的活动。 为了读取消息,我使用进程外语义阻塞svc.2.0.1406.1 工作流程如下:
1.我设置了活动id,应该使用它。EventSource.SetCurrentThreadActivityId.
2.然后我在同一个线程中有一些代码,但也可以在不同的线程中有很多代码。示例(来自以下任务的日志消息记录为不同的活动ID):

Events.Current.TestMethod3();
Task.WaitAll(Task.Factory.StartNew(()=>
{
对于(int i=0;i<10;i++)
{
Events.Current.TestMethod1_Sleep(50);
系统.线程.线程.睡眠(50);
Events.Current.TestMethod2_Continue();
}
}),
Task.Factory.StartNew(()=>
{
对于(int i=0;i<10;i++)
{
Events.Current.TestMethod1_Sleep(60);
系统.线程.线程.睡眠(60);
Events.Current.TestMethod2_Continue();
}
}));
Events.Current.TestMethod3();

有没有办法解决这个问题?也许我应该做一些特殊的事情来解决这个问题?

为了让它正常工作,您需要按照描述启用TPL事件源


如果使用进程外侦听器,则无法按名称启用TPL-必须改用TPL EventSource GUID。

@Darius TPL将发布将根活动ID与任务活动ID关联的传输事件。它不会将每个任务的活动ID设置为根线程的活动ID。非常非常违反直觉的行为是否可能对所有日志消息使用相同的活动ID?在代码中,我有很多地方使用TPL,如果可能的话,我想在一个地方解决问题?因为发布传输事件的意义是什么,当无法在日志中看到它们是相关的时。
Events.Current.TestMethod3();
Task.WaitAll(Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 10; i++)
    {
        Events.Current.TestMethod1_Sleep(50);
        System.Threading.Thread.Sleep(50);
        Events.Current.TestMethod2_Continue();
    }
}),
Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 10; i++)
    {
        Events.Current.TestMethod1_Sleep(60);
        System.Threading.Thread.Sleep(60);
        Events.Current.TestMethod2_Continue();
    }
}));
Events.Current.TestMethod3();