private unsafe void DispatchEventsToEventListeners()
        {
            // Struct to fill with the call to GetNextEvent.
            EventPipeEventInstanceData instanceData;

            while (!m_stopDispatchTask)
            {
                // Get the next event.
                while (!m_stopDispatchTask && EventPipeInternal.GetNextEvent(&instanceData))
                {
                    // Filter based on provider.
                    if (instanceData.ProviderID == m_RuntimeProviderID)
                    {
                        // Dispatch the event.
                        ReadOnlySpan <Byte> payload       = new ReadOnlySpan <byte>((void *)instanceData.Payload, (int)instanceData.PayloadLength);
                        DateTime            dateTimeStamp = TimeStampToDateTime(instanceData.TimeStamp);
                        RuntimeEventSource.Log.ProcessEvent(instanceData.EventID, instanceData.ThreadID, dateTimeStamp, instanceData.ActivityId, instanceData.ChildActivityId, payload);
                    }
                }

                // Wait for more events.
                if (!m_stopDispatchTask)
                {
                    Thread.Sleep(10);
                }
            }
        }
        private unsafe void DispatchEventsToEventListeners()
        {
            // Struct to fill with the call to GetNextEvent.
            EventPipeEventInstanceData instanceData;

            while (!m_stopDispatchTask)
            {
                bool eventsReceived = false;
                // Get the next event.
                while (!m_stopDispatchTask && EventPipeInternal.GetNextEvent(m_sessionID, &instanceData))
                {
                    eventsReceived = true;

                    // Filter based on provider.
                    if (instanceData.ProviderID == m_RuntimeProviderID)
                    {
                        // Dispatch the event.
                        ReadOnlySpan <byte> payload       = new ReadOnlySpan <byte>((void *)instanceData.Payload, (int)instanceData.PayloadLength);
                        DateTime            dateTimeStamp = TimeStampToDateTime(instanceData.TimeStamp);
                        NativeRuntimeEventSource.Log.ProcessEvent(instanceData.EventID, instanceData.ThreadID, dateTimeStamp, instanceData.ActivityId, instanceData.ChildActivityId, payload);
                    }
                }

                // Wait for more events.
                if (!m_stopDispatchTask)
                {
                    if (!eventsReceived)
                    {
                        EventPipeInternal.WaitForSessionSignal(m_sessionID, Timeout.Infinite);
                    }

                    Thread.Sleep(10);
                }
            }
        }
        private unsafe void DispatchEventsToEventListeners()
        {
            // Struct to fill with the call to GetNextEvent.
            EventPipeEventInstanceData instanceData;

            while (!m_stopDispatchTask)
            {
                bool eventsReceived = false;
                // Get the next event.
                while (!m_stopDispatchTask && EventPipeInternal.GetNextEvent(m_sessionID, &instanceData))
                {
                    eventsReceived = true;

                    // Filter based on provider.
                    if (instanceData.ProviderID == m_RuntimeProviderID)
                    {
                        // Dispatch the event.
                        ReadOnlySpan <Byte> payload       = new ReadOnlySpan <byte>((void *)instanceData.Payload, (int)instanceData.PayloadLength);
                        DateTime            dateTimeStamp = TimeStampToDateTime(instanceData.TimeStamp);
                        NativeRuntimeEventSource.Log.ProcessEvent(instanceData.EventID, instanceData.ThreadID, dateTimeStamp, instanceData.ActivityId, instanceData.ChildActivityId, payload);
                    }
                }

                // Wait for more events.
                if (!m_stopDispatchTask)
                {
                    if (!eventsReceived)
                    {
                        // Future TODO: this would make more sense to handle in EventPipeSession/EventPipe native code.
                        Debug.Assert(!m_dispatchTaskWaitHandle.SafeWaitHandle.IsInvalid);
                        m_dispatchTaskWaitHandle.WaitOne();
                    }

                    Thread.Sleep(10);
                }
            }
        }