/// <summary> /// Fetches a range of items. /// </summary> /// <param name="startIndex">The start index.</param> /// <param name="count">The number of items to fetch.</param> /// <returns></returns> public override IList <BigFileLine> FetchRange(int startIndex, int pageCount, out int overallCount) { //Trace.WriteLine("FetchRangeBigText: " + startIndex + "," + pageCount); lock (_inputStream) { if (_disposed || (startIndex / 100 >= _100LineIndex.Count)) { overallCount = _lastFetchCount; return(new List <BigFileLine>()); } int pos100BoundaryIndex = startIndex / 100; long pos100Boundary = _100LineIndex[startIndex / 100]; _inputStream.Seek(pos100Boundary, SeekOrigin.Begin); List <BigFileLine> list = _lineConverter.GetLines(_inputStream, startIndex - pos100BoundaryIndex * 100, Math.Min(startIndex + pageCount, Count) - startIndex); BlockingCollection <BigFileLine> columnCounter = StartCountingColumns(); foreach (var line in list) { columnCounter.Add(line); } columnCounter.CompleteAdding(); overallCount = _lastFetchCount; return(list); } }
/// <summary> /// Initializes a new instance of the <see cref="DemoCustomerProvider"/> class. /// </summary> /// <param name="count">The count.</param> /// <param name="fetchDelay">The fetch delay.</param> public FileLinesProvider(string inputFilename, int maxRows, BigFileLine lineConverter) { _maxRows = maxRows; _lineConverter = lineConverter; _inputFilename = inputFilename; _inputStream = new FileStream(inputFilename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); var firstLine = _lineConverter.GetLines(_inputStream, 0, 1).FirstOrDefault(); if (firstLine != null) { Header = firstLine.Columns.Aggregate((a, b) => a + "," + b); } _lineCountTask = Task.Run(() => CountLines(inputFilename, maxRows)); }