我正在编写一个使用 HttpWebRequest 将大文件上传到 Web 服务的应用程序。
此应用程序将由具有不同互联网速度的不同人运行。
我以 block 的形式异步读取文件,并将这些 block 异步写入请求流。我使用回调在循环中执行此操作。我一直这样做,直到发送了整个文件。
上传速度在写入之间计算,随后更新 GUI 以显示所述速度。
我面临的问题是确定缓冲区大小。如果我让它太大,连接速度慢的用户将看不到速度的频繁更新。如果我把它设置得太小,具有快速连接的用户最终会“锤击”读/写方法,导致 CPU 使用率飙升。
我现在所做的是以 128kb 的速度启动缓冲区,然后每 10 次写入检查这 10 次写入的平均写入速度,如果低于一秒,我将缓冲区大小增加 128kb。如果写入速度低于 5 秒,我也会以类似的方式缩小缓冲区。
这很好用,但感觉很随意,似乎还有改进的余地。我的问题是,有没有人处理过类似的情况,您采取了什么行动?
谢谢
最佳答案
我认为这是一个很好的方法。我也用过大文件上传。但是那有一个小星期。我通过调用我的不同服务来确定第一个请求中的连接速度。这实际上可以节省每个请求重新计算速度的开销。这样做的主要原因是
在慢速连接中,速度通常波动很大。因此,每个请求都重新计算它是没有意义的。
我还应该提供恢复功能,让用户能够从上次结束的位置重新上传文件。
考虑到可伸缩性,我曾经在第一个请求时固定缓冲区。让我知道是否有帮助
关于c# - 使用 HttpWebRequest 发送大文件,根据需要增加/缩小缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10868000/