public static Task <bool> RealTimeTraceEventSessionAsync
 (
     string providerName
     , string sessionName
     , string tracingFileName = null
     , string[] traceEvents   = null
     , Action
     <
         long
         , TraceEventDispatcher
         , TraceEventSession
         , TraceEvent
     > onOneEventTracedOnceProcessAction = null
     , TraceEventProviderOptions traceEventProviderOptions = null
     , TraceEventSessionOptions traceEventSessionOptions   = TraceEventSessionOptions.Create
     , TraceEventSourceType traceEventSourceType           = TraceEventSourceType.MergeAll
     , TraceEventLevel traceEventLevel = TraceEventLevel.Always
     , ulong matchKeywords             = ulong.MaxValue
     , bool needCountHits = false
 )
 {
     return
         (Task
          .Factory
          .StartNew <bool>
          (
              () =>
     {
         return
         RealTimeTraceEventSession
         (
             providerName
             , sessionName
             , tracingFileName
             , traceEvents
             , onOneEventTracedOnceProcessAction
             , traceEventProviderOptions
             , traceEventSessionOptions
             , traceEventSourceType
             , traceEventLevel
             , matchKeywords
             , needCountHits
         );
     }
              ,
              TaskCreationOptions.LongRunning
              |
              TaskCreationOptions.DenyChildAttach
          ));
 }
        public bool RealTimeTraceEventSession
        (
            string providerName
            , string sessionName
            , string tracingFileName = null
            , string[] traceEvents   = null
            , Action
            <
                long
                , TraceEventDispatcher
                , TraceEventSession
                , TraceEvent
            > onOneEventTracedOnceProcessAction = null
            , TraceEventProviderOptions traceEventProviderOptions = null
            , TraceEventSessionOptions traceEventSessionOptions   = TraceEventSessionOptions.Create
            , TraceEventSourceType traceEventSourceType           = TraceEventSourceType.MergeAll
            , TraceEventLevel traceEventLevel = TraceEventLevel.Always
            , ulong matchKeywords             = ulong.MaxValue
            , bool needCountHits = false)
        {
            var r = false;

            if
            (
                traceEvents != null
                &&
                traceEvents.Length > 0
                &&
                onOneEventTracedOnceProcessAction != null
            )
            {
                r = TraceEventsHelper
                    .RealTimeTraceEventSession
                    (
                    providerName
                    , sessionName
                    , tracingFileName
                    , traceEvents
                    , onOneEventTracedOnceProcessAction
                    , traceEventProviderOptions
                    , traceEventSessionOptions
                    , traceEventSourceType
                    , traceEventLevel
                    , matchKeywords
                    , needCountHits
                    );
            }
            return(r);
        }
        public static bool RealTimeTraceEventSession
            (
                string providerName
                , string sessionName
                , string tracingFileName = null
                , string[] traceEvents = null
                , Action
                        <
                            long
                            , TraceEventDispatcher
                            , TraceEventSession
                            , TraceEvent
                        > onOneEventTracedOnceProcessAction = null
                , TraceEventProviderOptions traceEventProviderOptions = null
                , TraceEventSessionOptions traceEventSessionOptions = TraceEventSessionOptions.Create
                , TraceEventSourceType traceEventSourceType = TraceEventSourceType.MergeAll
                , TraceEventLevel traceEventLevel = TraceEventLevel.Always
                , ulong matchKeywords = ulong.MaxValue
                , bool needCountHits = false
            )
        {
            var r = false;
            if (!(TraceEventSession.IsElevated() ?? false))
            {
                Out.WriteLine("To turn on ETW events you need to be Administrator, please run from an Admin process.");
                return r;
            }
            var needTracingFile = !string.IsNullOrEmpty(tracingFileName);
            if
                (
                    traceEvents != null
                    &&
                    traceEvents.Length > 0
                    &&
                    onOneEventTracedOnceProcessAction != null
                )
            {
                using
                    (
                        var session =
                                (
                                    needTracingFile
                                    ?
                                    new TraceEventSession
                                                (
                                                    sessionName
                                                    , tracingFileName
                                                    , traceEventSessionOptions
                                                )
                                    {
                                        StopOnDispose = true
                                    }
                                    :
                                    new TraceEventSession
                                                (
                                                    sessionName
                                                    , traceEventSessionOptions
                                                )
                                    {
                                        StopOnDispose = true
                                    }
                                )
                    )
                {
                    using
                        (
                            var source =
                                        (
                                            needTracingFile
                                            ?
                                            new ETWTraceEventSource(tracingFileName)
                                            :
                                            session.Source
                                        )
                            )
                    {
                        long sequence = 0;
                        RegisterCallbacks
                            (
                                providerName
                                , traceEvents
                                , source
                                , session
                                , (x, y, z) =>
                                {
                                    long id = 0;
                                    if (needCountHits)
                                    {
                                        id = Interlocked.Increment(ref sequence);
                                    }
                                    onOneEventTracedOnceProcessAction
                                                    (
                                                        id
                                                        , x
                                                        , y
                                                        , z
                                                    );
                                }
                            );
                        var restarted = session
                                            .EnableProvider
                                                (
                                                    providerName
                                                    , traceEventLevel
                                                    , matchKeywords
                                                    , traceEventProviderOptions
                                                );
                        source
                            .Process();
                        r = true;
                    }
                }

            }
            return r;
        }
 public static Task<bool> RealTimeTraceEventSessionAsync
                     (
                         string providerName
                         , string sessionName
                         , string tracingFileName = null
                         , string[] traceEvents = null
                         , Action
                                 <
                                     long
                                     , TraceEventDispatcher
                                     , TraceEventSession
                                     , TraceEvent
                                 > onOneEventTracedOnceProcessAction = null
                         , TraceEventProviderOptions traceEventProviderOptions = null
                         , TraceEventSessionOptions traceEventSessionOptions = TraceEventSessionOptions.Create
                         , TraceEventSourceType traceEventSourceType = TraceEventSourceType.MergeAll
                         , TraceEventLevel traceEventLevel = TraceEventLevel.Always
                         , ulong matchKeywords = ulong.MaxValue
                         , bool needCountHits = false
                     )
 {
     return
         Task
             .Factory
             .StartNew<bool>
                 (
                     () =>
                     {
                         return
                             RealTimeTraceEventSession
                                 (
                                     providerName
                                     , sessionName
                                     , tracingFileName
                                     , traceEvents
                                     , onOneEventTracedOnceProcessAction
                                     , traceEventProviderOptions
                                     , traceEventSessionOptions
                                     , traceEventSourceType
                                     , traceEventLevel
                                     , matchKeywords
                                     , needCountHits
                                 );
                     }
                     ,
                         TaskCreationOptions.LongRunning
                         |
                         TaskCreationOptions.DenyChildAttach
                 );
 }
        public bool RealTimeTraceEventSession
            (
                string providerName
                , string sessionName
                , string tracingFileName = null
                , string[] traceEvents = null
                , Action
                        <
                            long
                            , TraceEventDispatcher
                            , TraceEventSession
                            , TraceEvent
                        > onOneEventTracedOnceProcessAction = null
                , TraceEventProviderOptions traceEventProviderOptions = null
                , TraceEventSessionOptions traceEventSessionOptions = TraceEventSessionOptions.Create
                , TraceEventSourceType traceEventSourceType = TraceEventSourceType.MergeAll
                , TraceEventLevel traceEventLevel = TraceEventLevel.Always
                , ulong matchKeywords = ulong.MaxValue
                , bool needCountHits = false)
        {

            var r = false;
            if
                (
                    traceEvents != null
                    &&
                    traceEvents.Length > 0
                    &&
                    onOneEventTracedOnceProcessAction != null
                )
            {
                r = TraceEventsHelper
                            .RealTimeTraceEventSession
                                (
                                    providerName
                                    , sessionName
                                    , tracingFileName
                                    , traceEvents
                                    , onOneEventTracedOnceProcessAction
                                    , traceEventProviderOptions
                                    , traceEventSessionOptions
                                    , traceEventSourceType
                                    , traceEventLevel
                                    , matchKeywords
                                    , needCountHits
                                );
            }
            return r;
        }
        public static bool RealTimeTraceEventSession
        (
            string providerName
            , string sessionName
            , string tracingFileName = null
            , string[] traceEvents   = null
            , Action
            <
                long
                , TraceEventDispatcher
                , TraceEventSession
                , TraceEvent
            > onOneEventTracedOnceProcessAction = null
            , TraceEventProviderOptions traceEventProviderOptions = null
            , TraceEventSessionOptions traceEventSessionOptions   = TraceEventSessionOptions.Create
            , TraceEventSourceType traceEventSourceType           = TraceEventSourceType.MergeAll
            , TraceEventLevel traceEventLevel = TraceEventLevel.Always
            , ulong matchKeywords             = ulong.MaxValue
            , bool needCountHits = false
        )
        {
            var r = false;

            if (!(TraceEventSession.IsElevated() ?? false))
            {
                Out.WriteLine("To turn on ETW events you need to be Administrator, please run from an Admin process.");
                return(r);
            }
            var needTracingFile = !string.IsNullOrEmpty(tracingFileName);

            if
            (
                traceEvents != null
                &&
                traceEvents.Length > 0
                &&
                onOneEventTracedOnceProcessAction != null
            )
            {
                using
                (
                    var session =
                        (
                            needTracingFile
                                    ?
                            new TraceEventSession
                            (
                                sessionName
                                , tracingFileName
                                , traceEventSessionOptions
                            )
                {
                    StopOnDispose = true
                }
                                    :
                            new TraceEventSession
                            (
                                sessionName
                                , traceEventSessionOptions
                            )
                {
                    StopOnDispose = true
                }
                        )
                )
                {
                    using
                    (
                        var source =
                            (
                                needTracingFile
                                            ?
                                new ETWTraceEventSource(tracingFileName)
                                            :
                                session.Source
                            )
                    )
                    {
                        long sequence = 0;
                        RegisterCallbacks
                        (
                            providerName
                            , traceEvents
                            , source
                            , session
                            , (x, y, z) =>
                        {
                            long id = 0;
                            if (needCountHits)
                            {
                                id = Interlocked.Increment(ref sequence);
                            }
                            onOneEventTracedOnceProcessAction
                            (
                                id
                                , x
                                , y
                                , z
                            );
                        }
                        );
                        var restarted = session
                                        .EnableProvider
                                        (
                            providerName
                            , traceEventLevel
                            , matchKeywords
                            , traceEventProviderOptions
                                        );
                        source
                        .Process();
                        r = true;
                    }
                }
            }
            return(r);
        }