我已开始使用ETW和Entlib 6的进程外语义日志块。 当我使用async/await时,继续线程上未设置CurrentThreadActivityId,并且TPL框架不记录传输事件。 这使得执行端到端跟踪非常困难。
根据Microsoft的文档,TPL框架应记录传输事件并生成新的activityid,但我似乎无法使其正常工作。 Entlib 6文档 以下是显示问题的简短示例:
为了记录TPL事件,我正在使用以下内容:
根据Microsoft的文档,TPL框架应记录传输事件并生成新的activityid,但我似乎无法使其正常工作。 Entlib 6文档 以下是显示问题的简短示例:
为了记录TPL事件,我正在使用以下内容:
<eventSource name="System.Threading.Tasks.TplEventSource" level="Informational" matchAnyKeyword="1"/>
这是我的测试代码:
using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AsyncContextTest
{
class Program
{
static Guid _activityId = Guid.NewGuid();
static void Main(string[] args)
{
EventSource.SetCurrentThreadActivityId(_activityId);
Console.WriteLine(EventSource.CurrentThreadActivityId);
Task t = Task.Run(async () => await DoStuffAsync());
Console.WriteLine(EventSource.CurrentThreadActivityId);
Console.Read();
}
public static async Task DoStuffAsync()
{
var x = "one,two,three".Split(',');
Console.WriteLine(EventSource.CurrentThreadActivityId);
await Task.Delay(1000);
Console.WriteLine(EventSource.CurrentThreadActivityId);
var y = String.Join(",", x);
Console.WriteLine("Done");
}
}
}
结果
334540cc-ccb1-4196-8587-815abf237e4c
334540cc-ccb1-4196-8587-815abf237e4c
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
Done
有人有一个简单的例子展示如何正确地使用ETW和async/await进行端到端追踪吗?
编辑:
我能够通过进程内监听器正确地运行它,但是无法通过进程外监听器记录TPL中的任何内容。
ThreadPoolSynchronizationContext
,它在任意线程池线程上执行继续操作。您将从那里使用ETW还是仅用于测试目的? - Yuval Itzchakov