使用HttpWebRequest发送大文件,根据需要调整缓冲区大小

6
我正在编写一个应用程序,使用HttpWebRequest将大文件上传到Web服务。此应用程序将由不同网速的各种人运行。
我使用回调函数循环异步读取文件块,并将这些块异步写入请求流中,直到整个文件都被发送。
上传速度在写操作之间计算,并更新GUI以显示该速度。
我的问题是决定缓冲区大小。如果我设置得太大,网速慢的用户将看不到上传速度的频繁更新。如果我设置得太小,网速快的用户将“猛击”读/写方法,导致CPU使用率飙升。
现在我开始缓冲区时使用128kb,每写10次后检查这些10次写的平均写入速度,如果低于1秒,则增加128kb的缓冲区大小。如果写入速度低于5秒,我也会类似地减小缓冲区。
这种做法效果相当不错,但感觉非常随意,还有改进的空间。我的问题是,是否有人遇到过类似情况,采取了什么行动?
谢谢

1
这似乎是一个非常可靠的方法。而且它也是有效的。我不会改变它。 - zmbq
1个回答

0

我认为这是一个不错的方法。我也在大文件上传中使用过它。但是有一个小调整。我通过调用我的不同服务来确定第一个请求的连接速度。这实际上可以节省每个请求重新计算速度的开销。这样做的主要原因是

  1. 在慢速连接中,速度通常会波动很大。因此,每个请求重新计算速度并没有意义。

  2. 我还需要提供恢复功能,用户可以从上次结束的地方重新上传文件。

考虑到可扩展性,我会在第一个请求中固定缓冲区。如果有帮助,请告诉我。


我最终按照我提到的方式完成了它,而且效果非常好。我从来不喜欢用你提到的方式确定速度的想法,因为如果主机在不同的国家或者网络速度慢的时候,它可能会给出错误的读数。但是你提出了一些很好的观点。接受了你的答案。 - NoPyGod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接