public void Reset()
        {
            if (_stream != null)
            {
                _stream?.Dispose();
                _stream = null;
            }

            _indexCurrentFile = 0;
            UpdateEventLogFilesFromDirectory();
            _currentFileEventNumber = 0;
            _currentRow             = null;
        }
        private bool InitializeReadFileStream()
        {
            if (_stream == null)
            {
                if (_logFilesWithData.Length <= _indexCurrentFile)
                {
                    _currentRow = null;
                    return(false);
                }

                string currentFile = _logFilesWithData[_indexCurrentFile];
                if (!File.Exists(currentFile))
                {
                    return(false);
                }

                InitializeStream(_indexCurrentFile);
                _currentFileEventNumber = 0;
            }

            return(true);
        }
        public async Task StartReadEvents(CancellationToken cancellationToken)
        {
            while (CurrentFile != null)
            {
                if (!InitializeReadFileStream())
                {
                    return;
                }

                RaiseBeforeReadFileEvent(out bool cancelBeforeReadFile);
                if (cancelBeforeReadFile)
                {
                    NextFile();
                    await StartReadEvents(cancellationToken);

                    return;
                }

                _position               = null;
                _currentRow             = null;
                _currentFileEventNumber = 1;
                var      currentLogFile     = _logFilesWithData[_indexCurrentFile];
                FileInfo currentLogFileInfo = new FileInfo(currentLogFile);

                try
                {
                    XEFileEventStreamer xeReader = new XEFileEventStreamer(_stream);
                    await xeReader.ReadEventStream(() =>
                    {
                        _position = new ExtendedEventsPosition(
                            _currentFileEventNumber,
                            CurrentFile,
                            null,
                            null,
                            false,
                            currentLogFileInfo.CreationTimeUtc,
                            currentLogFileInfo.LastWriteTimeUtc);
                        RaiseOnReadMetadata(new OnReadMetadataArgs(_position));
                        return(Task.CompletedTask);
                    },
                                                   (eventData) =>
                    {
                        _position = new ExtendedEventsPosition(
                            _currentFileEventNumber,
                            CurrentFile,
                            eventData.UUID.ToString(),
                            eventData.Timestamp,
                            false,
                            currentLogFileInfo.CreationTimeUtc,
                            currentLogFileInfo.LastWriteTimeUtc);

                        _currentRow = new ExtendedEvent(_currentFileEventNumber, eventData);
                        RaiseOnRead(new OnReadEventArgs(_currentRow, _position, _currentFileEventNumber));
                        _currentFileEventNumber++;

                        return(Task.CompletedTask);
                    }, cancellationToken);

                    _currentRow = null;
                    if (_position != null)
                    {
                        _position = new ExtendedEventsPosition(
                            _position.EventNumber,
                            _position.CurrentFileData,
                            _position.EventUUID,
                            _position.EventPeriod,
                            true,
                            currentLogFileInfo.CreationTimeUtc,
                            currentLogFileInfo.LastWriteTimeUtc
                            );
                    }
                    RaiseOnRead(new OnReadEventArgs(_currentRow, _position, _currentFileEventNumber));

                    NextFile();
                }
                catch (Exception ex)
                {
                    RaiseOnError(new OnErrorEventArgs(ex));
                    break;
                }
            }
        }