kay*_*one 15
此示例将尝试下载googletalk,然后输出下载的详细信息.
PS.当尝试时间和操作避免使用DateTime,因为它们可能导致问题或不稳定时,请始终使用System.Diognostics命名空间中提供的秒表.
const string tempfile = "tempfile.tmp";
System.Net.WebClient webClient = new System.Net.WebClient();
Console.WriteLine("Downloading file....");
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
webClient.DownloadFile("http://dl.google.com/googletalk/googletalk-setup.exe", tempfile);
sw.Stop();
FileInfo fileInfo = new FileInfo(tempfile);
long speed = fileInfo.Length / sw.Elapsed.Seconds;
Console.WriteLine("Download duration: {0}", sw.Elapsed);
Console.WriteLine("File size: {0}", fileInfo.Length.ToString("N0"));
Console.WriteLine("Speed: {0} bps ", speed.ToString("N0"));
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
T-m*_*oty 10
正如publicENEMY所说,kay.one的答案可能会给出错误的速度,因为HDD的速度可能低于网络速度(例如:Google千兆光纤比5200rpm HDD的平均写入速度快得多)
这是从kay.one的答案派生的示例代码,但是将数据内容下载到a System.Byte[],因此在内存中.
另外我注意到在第一次下载之后,速度急剧增加并跳过实际网络速度,因为System.Net.WebClient使用IE的下载缓存:对于我的要求,我只添加t查询字符串参数,对于每个请求显然是唯一的.
编辑
as.beaulieu发现了一个TimeSpan.Seconds用于计算的问题,包括非常快和非常慢的下载.
我们只需要使用TimeSpan.TotalSeconds.
Console.WriteLine("Downloading file....");
var watch = new Stopwatch();
byte[] data;
using (var client = new System.Net.WebClient())
{
watch.Start();
data = client.DownloadData("http://dl.google.com/googletalk/googletalk-setup.exe?t=" + DateTime.Now.Ticks);
watch.Stop();
}
var speed = data.LongLength / watch.Elapsed.TotalSeconds; // instead of [Seconds] property
Console.WriteLine("Download duration: {0}", watch.Elapsed);
Console.WriteLine("File size: {0}", data.Length.ToString("N0"));
Console.WriteLine("Speed: {0} bps ", speed.ToString("N0"));
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)