0

我使用此代码读取 HttpWebResponse 流

Stream stm = httpResp.GetResponseStream();
Stream fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
byte[] buff = new byte[1024 * 16];

AsyncCallback callback = null;
callback = ar =>
{
    int bytesRead = stm.EndRead(ar);
    fs.Write(buff, 0, bytesRead);
    if(bytesRead == 0)
        return;

    stm.BeginRead(buff, 0, buff.Length, callback, null);
};
stm.BeginRead(buff, 0, buff.Length, callback, null);

我想限制下载速率。如果我在回调中放置一个 Thread.Sleep() ,它将使线程保持阻塞,但它不能很好地适应许多流。有没有其他方法可以实现下载限制和线程经济?

4

1 回答 1

0

在循环中设置睡眠可能会限制下载速率。它取决于底层协议实现和内部网络流缓冲区的大小。

在我的系统(Windows Server 2008、.NET 4.5)上,在循环中设置睡眠确实会限制下载速度。

它还取决于request.AllowReadStreamBuffering属性的设置。文档说默认设置是true,但我的测试显示默认设置false在我的系统上。事实上,试图将其设置为true抛出异常。

但是,似乎默认值是trueSilverlight。请参阅该属性的 Silverlight 文档。当设置为 时true,在准备好读取响应之前读取并缓冲整个响应。

假设限制读取请求的速率将限制下载速率(这似乎是合理的,前提是您禁用读取流缓冲),我看不出使用BeginRead/的好方法EndRead。正如您所指出的,将 aThread.Sleep放入其中并不能很好地扩展。

对于 .NET 4.5 和 C# 5.0,您应该考虑使用GetResponseAsync来获取响应,并ReadAsync在读取响应流时使用。使用 .NET 4.0,您可以创建一个任务来进行阅读。其中任何一个都可以让您使用Task.Delay来创建延迟。这将具有与控制下载速度相同的效果Thread.Sleep,但不会阻塞线程。

不幸的是,我没有你的例子。

于 2013-03-17T05:23:48.070 回答