我已经实现了一个文件传输速率计算器,用于显示应用程序中上传过程的kB/sec,然而使用以下代码后,似乎在文件开始上传后我的KB/s读数会出现“突发”。
现在上传过程的输出日志和相应的kB/sec读数如下: (您会注意到一个新文件以 'File Start' 开始,以 'File End' 结束)
我的问题是,你会注意到,我所说的“突发”现象始于每个新文件的开头,达到了几兆字节的峰值,然后逐渐平稳。上传会像这样突然增加吗?我的上传速度通常不会超过40k / sec,所以肯定不对。
这是一个真正的问题,当我在屏幕上显示最近5-10秒的平均值时,它会产生一个约为3MB / sec的结果!
有什么好的方法来解决这个问题吗?我应该怎么做?:S
Graham
此外:为什么我不能执行“bytesPerSecond =(bytesRead / duration.Elapsed.TotalSeconds)”,并将duration.Start和duration.Stop移动到while循环中以获得准确的结果?我认为这会更准确?每个速度读取为900字节/秒,800字节/秒等。
这是我流代码的一部分,它将一个文件以1024个块的方式流式传输到服务器,使用httpWebRequest:
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' 开始,以 'File End' 结束)
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
我的问题是,你会注意到,我所说的“突发”现象始于每个新文件的开头,达到了几兆字节的峰值,然后逐渐平稳。上传会像这样突然增加吗?我的上传速度通常不会超过40k / sec,所以肯定不对。
这是一个真正的问题,当我在屏幕上显示最近5-10秒的平均值时,它会产生一个约为3MB / sec的结果!
有什么好的方法来解决这个问题吗?我应该怎么做?:S
Graham
此外:为什么我不能执行“bytesPerSecond =(bytesRead / duration.Elapsed.TotalSeconds)”,并将duration.Start和duration.Stop移动到while循环中以获得准确的结果?我认为这会更准确?每个速度读取为900字节/秒,800字节/秒等。