任务并行库和 PLINQ 中的 ETW 事件
任务并行库和 PLINQ 均可生成 Windows 事件跟踪 (ETW) 事件,通过 Windows 性能分析器等工具使用这些事件可分析并排除应用程序故障。 但在大多数情况下,分析并行应用程序代码的最佳方式是使用 Visual Studio 中的并发可视化工具。
任务并行库 ETW 事件
在 EVENT_HEADER 结构中,Parallel.ForParallel.ForEach 和 Parallel.Invoke 生成的事件的 ProviderId GUID 为:
0x2e5dba47, 0xa3d2, 0x4d16, 0x8e, 0xe0, 0x66, 0x71, 0xff, 0xdc, 0xd7, 0xb5
并行循环开始
EVENT_DESCRIPTOR.Task = 1
EVENT_DESCRIPTOR.Id = 1
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
ForkJoinContextID | System.Int32 | 用于为具有分叉/联接语义的事件指示嵌套和对的唯一标识符。 |
OperationType | System.Int32 | 指示循环的类型: 1 = ParallelInvoke 2 = ParallelFor 3 = ParallelForEach |
InclusiveFrom | System.Int64 | 循环计数器的起始值 |
ExclusiveTo | System.Int64 | 循环计数器的结束值 |
并行循环结束
EVENT_DESCRIPTOR.Task = 2
EVENT_DESCRIPTOR.Id = 2
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
ForkJoinContextID | System.Int32 | 用于为具有分叉/联接语义的事件指示嵌套和对的唯一标识符。 |
totalIterations | System.Int64 | 迭代总次数 |
并行调用开始
EVENT_DESCRIPTOR.Task = 3
EVENT_DESCRIPTOR.Id = 3
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
ForkJoinContextID | System.Int32 | 用于为具有分叉/联接语义的事件指示嵌套和对的唯一标识符。 |
totalIterations | System.Int64 | 迭代总次数 |
operationType | System.Int32 | 指示循环的类型: 1 = ParallelInvoke 2 = ParallelFor 3 = ParallelForEach |
ActionCount | System.Int32 | 将在并行调用中执行的操作数。 |
并行调用结束
EVENT_DESCRIPTOR.Task = 4
EVENT_DESCRIPTOR.Id = 4
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
ForkJoinContextID | System.Int32 | 用于为具有分叉/联接语义的事件指示嵌套和对的唯一标识符。 |
PINQ ETW 事件
PLINQ 的 EVENT_HEADER.ProviderId GUID 为:
0x159eeeec, 0x4a14, 0x4418, 0xa8, 0xfe, 0xfa, 0xab, 0xcd, 0x98, 0x78, 0x87
并行查询开始
EVENT_DESCRIPTOR.Task = 1
EVENT_DESCRIPTOR.Id = 1
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
QueryID | System.Int32 | 唯一的查询标识符。 |
并行查询结束
EVENT_DESCRIPTOR.Task = 2
EVENT_DESCRIPTOR.Id = 2
用户数据
名称 | 类型 | 说明 |
---|---|---|
OriginatingTaskSchedulerID | System.Int32 | 启动循环的 TaskScheduler 的 ID。 |
OriginatingTaskID | System.Int32 | 启动循环的任务的 ID。 |
QueryID | System.Int32 | 唯一的查询标识符。 |