System.Diagnostics.AsyncStreamReader.GetLinesFromStringBuilder C# (CSharp) Method

GetLinesFromStringBuilder() private method

private GetLinesFromStringBuilder ( ) : void
return void
        private void GetLinesFromStringBuilder() {
            int i = 0;
            int lineStart = 0;
            int len = sb.Length;

            // skip a beginning '\n' character of new block if last block ended 
            // with '\r'
            if (bLastCarriageReturn && (len > 0) && sb[0] == '\n')
            {            
                i = 1;
                lineStart = 1;
                bLastCarriageReturn = false;
            }
		 
            while(i < len) {
                char ch = sb[i];
                // Note the following common line feed chars:
                // \n - UNIX   \r\n - DOS   \r - Mac
                if (ch == '\r' || ch == '\n') {
                    string s = sb.ToString(lineStart, i - lineStart);
                    lineStart = i + 1;
                    // skip the "\n" character following "\r" character
                    if ((ch == '\r') && (lineStart < len) && (sb[lineStart] == '\n'))
                    {
                        lineStart++;
                        i++;                
                    }
                                        
                    lock(messageQueue) {
                        messageQueue.Enqueue(s);
                    }
                }
                i++;
            }             
            if (sb[len - 1] == '\r') {
                bLastCarriageReturn = true;
            } 
            // Keep the rest characaters which can't form a new line in string builder.
            if( lineStart < len) {
                sb.Remove(0, lineStart);
            }
            else {
                sb.Length = 0;
            }

            FlushMessageQueue();
        }