예제 #1
0
        /// <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);
        }