Shouldn't this be ReadAsync and not ReadBlockAsync? I think the fact we are using ReadBlock in the first place is the bug. To avoid deadlock the reader should never block? Read or ReadAsync will never block but return at most buffer.Length chars, while ReadBlock will wait until  are buffer.Length chars or return less on EOF.