質問が「転送速度を計算する方法」である場合は、ダウンロードされたバイトの合計数を経過した合計秒数で割ることができます。
bytes
--------- = transfer rate
seconds
C# で時間を測定する良い方法はStopWatchクラスです。コンピューター サイエンスの K は 1024 (または 2^10) であるため、バイト数を 1024 で割って (またはシフトして)、秒数で割ることができます。そのキロバイト数をダウンロードするのにかかりました。
平均転送速度に関心がある場合は、ダウンロードされたバイト数を間隔で測定する必要があります。これは、測定点とダウンロードされたバイト数とそれにかかった時間を保持する 2 次元のリストで行うことができます。簡単にするために、計算を行うクラスに分割します
private readonly Stopwatch watch;
private readonly long[,] average;
public .ctor() {
// use 10 measure points, for a larger or smaller average, adjust the 10
average = new long[10, 2];
watch = Stopwatch.StartNew();
}
public long BytesTransferred {
set {
for (int i = average.GetLength(0) - 1; i > 0; --i) {
average[i, 0] = average[i - 1, 0];
average[i, 1] = average[i - 1, 1];
}
average[0, 0] = sent = value;
average[0, 1] = watch.ElapsedMilliseconds;
}
}
public long TransferRate {
get {
int l = average.GetLength(0) - 1;
double bytes = average[0, 0] - average[l, 0];
double seconds = (average[0, 1] - average[l, 1]) / 1000d;
return (long)(bytes / seconds);
}
}
ダウンロード メソッドで、新しいスレッドを中断し、上記のクラスのインスタンスを作成し、BytesTransferred = totalBytes;
間隔ごとに呼び出します。TransferRate は、TransferRate を呼び出すたびに計算されます。別の単位が必要な場合は、それに応じて 1024 で割ります。