/// <inheritdoc /> public async Task <IEnumerable <TraceRecord> > ReadTraceRecordsAsync(Duration duration, ReadFilter filter, CancellationToken token) { var parser = this.GetParser(this.GetTraceRecordSession(duration)); var typesInFilter = filter.TraceRecordFilters.Select(item => item.RecordType).ToList(); var allRecords = new List <TraceRecord>(); Func <TraceRecord, CancellationToken, Task> traceReceiver = (record, cancellationToken) => { if (filter.TraceFilter != null) { if (filter.TraceFilter(record)) { return(CompletedTask); } } allRecords.Add(record.Clone()); return(CompletedTask); }; foreach (var type in typesInFilter) { await parser.SubscribeAsync(type, traceReceiver, token).ConfigureAwait(false); } if (parser.TraceSession.IsServerSideFilteringAvailable) { await parser.TraceSession.StartReadingAsync(filter.TraceRecordFilters, duration.StartTime, duration.EndTime, token).ConfigureAwait(false); } else { await parser.TraceSession.StartReadingAsync(duration.StartTime, duration.EndTime, token).ConfigureAwait(false); } return(allRecords); }