我已经开始使用ETW和来自Entlib 6的进程外语义记录块。当我使用async / await时,在继续线程上没有设置CurrentThreadActivityId,并且TPL框架没有记录传输事件。这使得执行端到端跟踪变得极其困难。
根据微软的文档,TPL框架应该记录一个转移事件并生成一个新的活动ID,但我似乎无法让它工作。
这是一个显示问题的小例子:
要记录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记录任何内容。
答案 0 :(得分:0)
更改配置以使用事件源的GUID而不是名称。
<eventSource id="2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5" level="Informational" />
输出如下:
605e615a-c849-4ee7-95b8-e6677f945c3f
605e615a-c849-4ee7-95b8-e6677f945c3f
00000001-0001-0000-0c22-0000ffdcd7b5
00000002-0001-0000-0c22-0000ffdcd7b5
Done
有没有人有一个简单的例子,显示正确的结束方式 使用ETW和async / await结束跟踪?
仍在寻找...