public override int Read() { Monitor.Enter(_syncRoot); try { if (_lineIndex < -1) { throw new ObjectDisposedException(GetType().AssemblyQualifiedName); } if (_lineIndex < 0) { throw new InvalidOperationException("Stream reader has already been closed."); } EnsureCharBuffer(1); char[] c = _charBuffer.Read(1); if (c.Length == 0) { return(-1); } _charPosition++; if (c[0] == '\r') { if (_crFlag) { _linePositions.AddLast(new Tuple <long, long>(BytePosition, _charPosition)); _lineIndex++; } else { _crFlag = true; } } else if (c[0] == '\n') { _linePositions.AddLast(new Tuple <long, long>(BytePosition, _charPosition)); _lineIndex++; _crFlag = false; } else if (_crFlag) { _linePositions.AddLast(new Tuple <long, long>(BytePosition, _charPosition)); _lineIndex++; _crFlag = false; } return((int)(c[0])); } finally { Monitor.Exit(_syncRoot); } }