private void ProcessEtwSource(ISourceDataProcessor <QuicEvent, object, Guid> dataProcessor, IProgress <int> progress, CancellationToken cancellationToken) { using var source = new ETWTraceEventSource(filePaths); long StartTime = 0; source.AllEvents += (evt) => { if (cancellationToken.IsCancellationRequested) { source.StopProcessing(); return; } if (info == null && evt.TimeStamp.Ticks != 0 && !IsKnownSynthEvent(evt)) { StartTime = evt.TimeStamp.Ticks; var firstEventNano = (evt.TimeStamp.Ticks - source.SessionStartTime.Ticks) * 100; var lastEventNano = (source.SessionEndTime.Ticks - source.SessionStartTime.Ticks) * 100; info = new DataSourceInfo(firstEventNano, lastEventNano, evt.TimeStamp.ToUniversalTime()); } else if (evt.ProviderGuid == QuicEvent.ProviderGuid) { try { var quicEvent = QuicEtwEvent.TryCreate(evt, new Timestamp((evt.TimeStamp.Ticks - StartTime) * 100)); if (quicEvent != null) { dataProcessor.ProcessDataElement(quicEvent, this, cancellationToken); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } progress.Report((int)(evt.TimeStampRelativeMSec / source.SessionEndTimeRelativeMSec * 100)); }; source.Process(); if (info == null) { info = new DataSourceInfo(0, (source.SessionEndTime.Ticks - source.SessionStartTime.Ticks) * 100, source.SessionStartTime.ToUniversalTime()); } }
private void ProcessEtwSource(ISourceDataProcessor <QuicEvent, object, Guid> dataProcessor, IProgress <int> progress, CancellationToken cancellationToken) { using var source = new ETWTraceEventSource(filePaths); long StartTime = 0; source.AllEvents += (evt) => { bool isOriginalHeader = source.SessionStartTime == evt.TimeStamp; if (info == null && !isOriginalHeader && !IsKnownSynthEvent(evt) && evt.TimeStamp.Ticks != 0) { var deltaBetweenStartAndFirstTicks = evt.TimeStamp.Ticks - source.SessionStartTime.Ticks; var relativeNanoSeconds = deltaBetweenStartAndFirstTicks * 100; StartTime = evt.TimeStamp.Ticks; var lastnano = relativeNanoSeconds + ((source.SessionEndTime.Ticks - evt.TimeStamp.Ticks) * 100); info = new DataSourceInfo(relativeNanoSeconds, lastnano, evt.TimeStamp.ToUniversalTime()); } progress.Report((int)(evt.TimeStampRelativeMSec / source.SessionEndTimeRelativeMSec * 100)); }; source.AllEvents += (evt) => { if (cancellationToken.IsCancellationRequested) { source.StopProcessing(); return; } if (evt.ProviderGuid == MsQuicEtwGuid) { var quicEvent = new QuicEtwEvent(evt, new Timestamp((evt.TimeStamp.Ticks - StartTime) * 100)); dataProcessor.ProcessDataElement(quicEvent, this, cancellationToken); } }; source.Process(); if (info == null) { info = new DataSourceInfo(0, (source.SessionEndTime.Ticks - source.SessionStartTime.Ticks) * 100, source.SessionStartTime.ToUniversalTime()); } }