【发布时间】:2009-11-09 11:23:34
【问题描述】:
我已经实现了一个文件传输率计算器来显示我的应用程序中发生的上传过程的 kB/sec,但是使用以下代码,我似乎在文件开始后的 KB/s 读数中出现“突发”上传。
这是我的流代码的一部分,它使用 httpWebRequest 将 1024 个块的文件流式传输到服务器:
using (Stream httpWebRequestStream = httpWebRequest.GetRequestStream())
{
if (request.DataStream != null)
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
Debug.WriteLine("File Start");
var duration = new Stopwatch();
duration.Start();
while (true)
{
bytesRead = request.DataStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
httpWebRequestStream.Write(buffer, 0, bytesRead);
totalBytes += bytesRead;
double bytesPerSecond = 0;
if (duration.Elapsed.TotalSeconds > 0)
bytesPerSecond = (totalBytes / duration.Elapsed.TotalSeconds);
Debug.WriteLine(((long)bytesPerSecond).FormatAsFileSize());
}
duration.Stop();
Debug.WriteLine("File End");
request.DataStream.Close();
}
}
现在上传过程的输出日志和相关的 kB/sec 读数如下: (您会注意到一个新文件以“文件开始”和“文件结束”开始和结束)
File Start
5.19 MB
7.89 MB
9.35 MB
11.12 MB
12.2 MB
13.13 MB
13.84 MB
14.42 MB
41.97 kB
37.44 kB
41.17 kB
37.68 kB
40.81 kB
40.21 kB
33.8 kB
34.68 kB
33.34 kB
35.3 kB
33.92 kB
35.7 kB
34.36 kB
35.99 kB
34.7 kB
34.85 kB
File End
File Start
11.32 MB
14.7 MB
15.98 MB
17.82 MB
18.02 MB
18.88 MB
18.93 MB
19.44 MB
40.76 kB
36.53 kB
40.17 kB
36.99 kB
40.07 kB
37.27 kB
39.92 kB
37.44 kB
39.77 kB
36.49 kB
34.81 kB
36.63 kB
35.15 kB
36.82 kB
35.51 kB
37.04 kB
35.71 kB
37.13 kB
34.66 kB
33.6 kB
34.8 kB
33.96 kB
35.09 kB
34.1 kB
35.17 kB
34.34 kB
35.35 kB
34.28 kB
File End
您会注意到我的问题是,我所说的“爆发”从每个新文件的开头开始,在 MB 中达到峰值,然后适当地平衡。像这样突然上传是正常的吗?我的上传速度在这里通常不会超过 40k/秒,所以它不可能是正确的。
这是一个真正的问题,当我将最后 5 到 10 秒的平均时间用于屏幕显示时,它确实会产生大约 3MB/秒左右的结果!
如果我以最好的方式解决这个问题,有什么想法吗?我应该怎么做? :S
格雷厄姆
另外:为什么我不能执行 'bytesPerSecond = (bytesRead / duration.Elapsed.TotalSeconds)' 并将 duration.Start 和 duration.Stop 移动到 while 循环中并获得准确的结果?我会认为这会更准确?每种速度读取为 900 字节/秒、800 字节/秒等。
【问题讨论】:
标签: c# .net networking stream