NetworkStream.Read()はsynchronousなメソッドなのでブロックするのは問題無い。
問題があるのはMSDNリファレンスの次のくだり。
読み取りに使用できるデータがない場合、Read メソッドは 0 を返します。
**嘘です。**返しません。
NetworkStreamはReadTimeout/WriteTimeoutというプロパティがあって、
同期Read/Writeがブロックする時間の上限がここに設定してある。
で、リファレンスによると
既定値は Infinite で、読み取り操作がタイムアウトしないことを示します。
となっている。
ちなみにこのReadTimeout/WriteTimeoutを設定すれば、設定時間経過後に処理が戻るが
タイムアウトした事を示すIOExceptionが投げられるので処理がなんとも書きづらい。