I am interested in listening to ETW (event tracing for Windows) TPL events, in particular I'd like to know when a Task
starts and when it stops.
Here's a sample program I've used for testing:
using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication10
{
class Listener : EventListener
{
private static readonly Guid tplGuid = new Guid("2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5");
protected override void OnEventSourceCreated(EventSource eventSource)
{
Console.WriteLine("Got guid: " + eventSource.Guid);
EnableEvents(eventSource, EventLevel.LogAlways);
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
Console.WriteLine("Event: " + eventData.EventId);
}
}
class Program
{
static void Main(string[] args)
{
using (var listener = new Listener())
{
Action doIt = null;
doIt = () =>
{
Thread.Sleep(1000);
Console.Write('.');
Task.Run(doIt);
};
Task.Run(doIt);
Parallel.Invoke(() => Console.WriteLine("invoke"));
Console.Read();
}
}
}
}
Sample output is as follows on my machine:
Got guid: 8e9f5090-2d75-4d03-8a81-e5afbf85daf1
Got guid: 2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5
Event: 3
invoke
Event: 4
.......
So the Invoke method causes an event to fire, yet the Tasks fire none. Looking at the Task source (e.g. reference source) the code appears no different from how the Parallel.Invoke
event fires.
What is wrong with the above, or, how do I listen to TaskStarted and TaskCompleted events (or any Task related event for that matter)?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…