ETW Events in Task Parallel Library and PLINQ

Both the Task Parallel Library and PLINQ generate Event Trace for Windows (ETW) events that you can use to profile and troubleshoot applications by using tools such as the Windows Performance Analyzer. However, in most scenarios, the best way to profile parallel application code is to use the Concurrency Visualizer in Visual Studio.

Task Parallel Library ETW Events

In the EVENT_HEADER structure, the ProviderId GUID for events generated by Parallel.For, Parallel.ForEach and Parallel.Invoke is:

0x2e5dba47, 0xa3d2, 0x4d16, 0x8e, 0xe0, 0x66, 0x71, 0xff, 0xdc, 0xd7, 0xb5

Parallel Loop Begin

EVENT_DESCRIPTOR.Task = 1

EVENT_DESCRIPTOR.Id = 1

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
ForkJoinContextID System.Int32 A unique identifier used to indicate nesting and pairs for events with fork/join semantics.
OperationType System.Int32 Indicates the type of loop:

1 = ParallelInvoke

2 = ParallelFor

3 = ParallelForEach
InclusiveFrom System.Int64 The starting value of the loop counter
ExclusiveTo System.Int64 The ending value of the loop counter

Parallel Loop End

EVENT_DESCRIPTOR.Task = 2

EVENT_DESCRIPTOR.Id = 2

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
ForkJoinContextID System.Int32 A unique identifier used to indicate nesting and pairs for events with fork/join semantics.
totalIterations System.Int64 The total number of iterations

Parallel Invoke Begin

EVENT_DESCRIPTOR.Task = 3

EVENT_DESCRIPTOR.Id = 3

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
ForkJoinContextID System.Int32 A unique identifier used to indicate nesting and pairs for events with fork/join semantics.
totalIterations System.Int64 The total number of iterations
operationType System.Int32 Indicates the type of loop:

1 = ParallelInvoke

2 = ParallelFor

3 = ParallelForEach
ActionCount System.Int32 The number of actions that will be executed in the parallel invoke.

Parallel Invoke End

EVENT_DESCRIPTOR.Task = 4

EVENT_DESCRIPTOR.Id = 4

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
ForkJoinContextID System.Int32 A unique identifier used to indicate nesting and pairs for events with fork/join semantics.

PLINQ ETW Events

The EVENT_HEADER.ProviderId GUID for PLINQ is:

0x159eeeec, 0x4a14, 0x4418, 0xa8, 0xfe, 0xfa, 0xab, 0xcd, 0x98, 0x78, 0x87

Parallel Query Begin

EVENT_DESCRIPTOR.Task = 1

EVENT_DESCRIPTOR.Id = 1

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
QueryID System.Int32 A unique query identifier.

Parallel Query End

EVENT_DESCRIPTOR.Task = 2

EVENT_DESCRIPTOR.Id = 2

User Data

Name Type Description
OriginatingTaskSchedulerID System.Int32 The ID of the TaskScheduler that started the loop.
OriginatingTaskID System.Int32 The ID of the task that started the loop.
QueryID System.Int32 A unique query identifier.

See also