Я реализовал калькулятор скорости передачи файлов, чтобы отображать кБ / с для процесса загрузки, происходящего в моем приложении, однако с помощью следующего кода мне кажется, что я получаю «пачки» в моих показаниях в килобайтах сразу после того, как файл начинает загрузить.
Это часть моего потокового кода, которая передает файл в 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();
}
}
Теперь выходной журнал процесса загрузки и связанные показания в килобайтах выглядят следующим образом:
(Вы заметите, что новый файл начинается и оканчивается на «Начало файла» и «Конец файла»)
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
Моя проблема, как вы заметите, «всплеск», о котором я говорю, начинается в начале каждого нового файла, достигает максимума в МБ, а затем выравнивается должным образом. это нормально для загрузки, чтобы лопнуть, как это? Моя скорость загрузки, как правило, не будет превышать 40 к / с здесь, поэтому она не может быть правильной.
Это реальная проблема, когда я беру в среднем последние 5–10 секунд для отображения на экране, это действительно выдает результаты, дающие результат около ~ 3 МБ / с!
Есть идеи, если я подхожу к этой проблеме наилучшим образом? и что мне делать? : S
Graham
Также: Почему я не могу сделать 'bytesPerSecond = (bytesRead / duration.Elapsed.TotalSeconds)
' и переместить duration.Start &uration.Stop в цикл while и получить точные результаты? Я бы подумал, что это будет точнее? Каждая скорость читается как 900 байт / с, 800 байт / с и т. Д.