我如何监听TPLTaskStarted/TaskCompletedETW事件知道任务何时开始以及何时停止。这是我用于测试的演示程序:usingSystem;使用System.Collections.Generic;使用System.Diagnostics.Tracing;使用System.Linq;使用系统文本;使用系统线程;使用System.Threading.Tasks;namespaceConsoleApplication10{classListener:EventListener{privatestaticreadonlyGuidtplGuid=newGuid("2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5");protectedoverridevoidOnEventSourceCreated(EventSourceeventSource){Console.WriteLine("Gotguid:"+eventSource.Guid);EnableEvents(eventSource,EventLevel.LogAlways);}protectedoverridevoidOnEventWritten(EventWrittenEventArgseventData){Console.WriteLine("Event:"+eventData.EventId);}}classProgram{staticvoidMain(string[]args){using(varlistener=newListener()){ActiondoIt=null;doIt=()=>{Thread.Sleep(1000);控制台.Write('.');任务。运行(做);};任务。运行(做);Parallel.Invoke(()=>Console.WriteLine("invoke"));控制台.Read();}}}}我的机器上的显示示例如下:Gotguid:8e9f5090-2d75-4d03-8a81-e5afbf85daf1Gotguid:2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5Event:3invokeEvent:4......所以Invoke方法导致事件触发,但任务没有tfireany事件看任务源(比如引用源),代码和Parallel.Invoke事件的触发方式没有区别。以上有什么问题,或者,我如何收听TaskStarted和TaskCompleted事件(或与此相关的任何与任务相关的事件)?你的问题让我想到了ETW(我一直想研究它)。我能够使用Microsoft.Diagnostics.Tracing.TraceEventNuGet库通过以下简单代码捕获“任务开始”和“任务结束”:privatestaticvoidMain(string[]args){Task.Run(()=>{使用(varsession=newTraceEventSession("TplCaptureSession")){session.EnableProvider(newGuid("2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5"),TraceEventLevel.Always);session.Source.Dynamic.AddCallbackForProviderEvent("readSystem.。任务TaskExecute/Stop",@event=>{Console.WriteLine("内部任务停止");});session.Source.Process();}});vartask=Task.Run(async()=>{awaitTask.Delay(20000);});任务.等待();基本上会发生什么:我们使用TraceEventSession启动一个新的实时事件捕获会话,我们将其传递给TraceEventLevel.Always打印出所有消息(我们可以将它缩小到TranceEventLevel.Information,但对于示例我选择全部)。我们通过将其Guid传递给session.EnableProvider来启用TplEventSource提供程序。一旦TplEventSource(显然是TPL的事件源)触发TaskExecute/Start或TaskExecute/Stop事件(取自参考源),我们注册一个回调TplEventSource,一旦我们进入活动就会打印它。请注意,我使用Task.Run只是因为session.Source.Process()是一个阻塞调用,我希望它在后台运行。下面是我编写的代码示例,它仅使用BCL来侦听TPLETW事件。让我感到困惑的部分是您需要运行此代码://CausethetypeinitializerforSystem.Threading.Tasks.TplEtwProvidertorun。//否则将错过异步方法构建器启动事件。Type.GetType("System.Threading.Tasks.TplEtwProvider,mscorlib",true).GetField("Log").GetValue(null);否则,一切似乎都按您预期的方式进行。不需要第三方库!以上是C#学习教程:如何监听TPLTaskStarted/TaskCompletedETW事件分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
