public Task<string> ReadStringAsync()
{
//read string length
Task<ushort> lengthTask = ReadShortAsync();
if(lengthTask.IsCompleted)
{
//synchronously completed (probably as it could be read from the buffer)
ushort len = lengthTask.Result;
//check for empty string
if(0 == len)
return String.Empty.AsTask();
if(TryGetSegmentFromBuffer(len))
{
//yep, enough data available, return a cached version of the string
string str = Encoding.UTF8.GetString(_lastReadSegment.Array, _lastReadSegment.Offset,
_lastReadSegment.Count);
return str.AsTask();
}
}
//more data needs to be read, take the long way
return ReadStringAsync(lengthTask);
}