Well, I tested again, this time on .NET 2 (previously I used 4). I get 8 bytes in both cases.

How do you know how many bytes have been returned? Your sample code doesn't show that and in the 3rd cases it's impossible to get more than 8 bytes unless the block size is > 8.

Btw, in the 3rd case you should check the value returned by Read.