2017-01-10 17 views
-1

在Form1我應該如何使用秒錶來計算文件下載的下載速度?

Stopwatch sw = new Stopwatch(); 

然後

private void btnDownload_Click(object sender, EventArgs e) 
     { 
      //urll.Add("http://download.thinkbroadband.com/1GB.zip"); 

      label7.Text = "Downloading images"; 

      var v = lines.Where(s => s.Contains("Name")).Select(s => s.Substring(15)); 
      var q = lines.Where(s => s.Contains("Code")).Select(s => s.Substring(15)); 
      var r = q.Where(c => c == "is").Concat(q.Where(c => c != "is")); 
      var p = v.Where(c => c == "Israel").Concat(v.Where(c => c != "Israel")); 
      var n = r.Count(); 
      int i = 0; 

      var results = p.ToList(); 

      downloadFile(ExtractImages.imagesUrls); 
     } 

     private Queue<string> _downloadUrls = new Queue<string>(); 

     private async void downloadFile(IEnumerable<string> urls) 
     { 
      foreach (var url in urls) 
      { 
       _downloadUrls.Enqueue(url); 
      } 

      await DownloadFile(); 
     } 

     private async Task DownloadFile() 
     { 
      if (_downloadUrls.Any()) 
      { 
       WebClient client = new WebClient(); 
       client.DownloadProgressChanged += ProgressChanged; 
       client.DownloadFileCompleted += Completed; 

       var url = _downloadUrls.Dequeue(); 

       await client.DownloadFileTaskAsync(new Uri(url), @"C:\Temp\TestingSatelliteImagesDownload\" + count + ".jpg"); 
       return; 
      } 
     } 

     private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
     { 
      // Calculate download speed and output it to labelSpeed. 
      label3.Text = string.Format("{0} kb/s", (e.BytesReceived/1024d/sw.Elapsed.TotalSeconds).ToString("0.00")); 
     } 

的頂部和完成的事件

long bytesFromCompletedFiles = 0; 
     // The event that will trigger when the WebClient is completed 
     private async void Completed(object sender, AsyncCompletedEventArgs e) 
     { 
      if (e.Cancelled == true) 
      { 
       MessageBox.Show("Download has been canceled."); 
      } 
      else 
      { 
       ProgressBar1.Value = 100; 
       count++; 
       bytesFromCompletedFiles += totalBytes[count -1]; 
       await DownloadFile(); 
      } 
     } 

的問題是,我從來沒有開始SW(秒錶)永不止步/隨時隨地重置。 所以在行:

label3.Text = string.Format("{0} kb/s", (e.BytesReceived/1024d/sw.Elapsed.TotalSeconds).ToString("0.00")); 

我看到無窮大的符號在SW

的問題是我應該在哪裏開始/停止/復位SW?

現在,當我運行該程序時,我在標籤3上看不到任何東西,我猜想自從無窮大,並且我沒有啓動sw(秒錶)。

回答

4

它會是有意義下載開始前纔開始Stopwatch,因爲如果你開始它早些時候會產生錯誤的結果

private async Task DownloadFile() 
{ 
    if (_downloadUrls.Any()) 
    { 
     WebClient client = new WebClient(); 
     [...] 

     sw = Stopwatch.StartNew(); 
     await client.DownloadFileTaskAsync(new Uri(url), @"C:\Temp\TestingSatelliteImagesDownload\" + count + ".jpg"); 
     return; 
    } 
} 

,並停止其下載已被取消或之後完成

// The event that will trigger when the WebClient is completed 
private async void Completed(object sender, AsyncCompletedEventArgs e) 
{ 
    if ([...]) 
    { 
     [...] 
    } 
    else 
    { 
     [...] 
    } 
    sw.Stop(); 
} 
+1

你還想在返回之前停止它 – slawekwin

+0

@slawekwin在哪裏?在progresschanged事件中?你能說明還有什麼地方可以阻止它嗎? –