Take a look at http://www.codeproject.com/KB/IP/MyDownloader.aspx
It uses the well-known method, which can be found in Downloader.Extension \ SpeedLimit
Basically, before reading more data, the stream checks how much data has actually been read from the previous iteration. If this speed exceeds the maximum speed, the read command pauses for a very short time, and the test is repeated. Most applications use this technique.
source
share