2016-12-28 30 views
0

在form1中,我在另一個類中創建List imagesUrls之後開始了backgroundworker。爲什麼使用backgroundworker工作不好,有時候我收到異常?

但是我得到的dowork事件,然後在progresschanged事件是在progressBar1上,也在label2上,我看到它是由10計數:10,20,30,40 .... 100%然後當它達到100%,它拋出異常。

例外:

附加信息:異常已被調用的目標拋出。

唯一的例外是在上線的Program.cs:

Application.Run(new Form1()); 

我想是從列表中imagesUrls下載各個文件和更新進度,並從0每個文件下載進度LABEL2 %至1 100%不是10的:1,2,3,4,5 ... 100每個文件下載到報告從0下載的進度,100

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 
using System.Net; 
using System.Threading; 

namespace SatelliteImages 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      ExtractImages ei = new ExtractImages(); 
      ei.Init(); 

      backgroundWorker1.RunWorkerAsync(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      BackgroundWorker worker = sender as BackgroundWorker; 

      for (int i = 1; i <= ExtractImages.imagesUrls.Count(); i++) 
      { 
       if (worker.CancellationPending == true) 
       { 
        e.Cancel = true; 
        break; 
       } 
       else 
       { 
        using (var client = new WebClient()) 
        { 
         client.DownloadFile(ExtractImages.imagesUrls[i], @"C:\Temp\TestingSatelliteImagesDownload\" + i + ".jpg"); 
         System.Threading.Thread.Sleep(500); 
         worker.ReportProgress(i * 10); 
        } 
       } 
      } 
     } 

     private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar1.Value = e.ProgressPercentage; 
      label2.Text = (e.ProgressPercentage.ToString() + "%"); 
     } 

     private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 

     } 
    } 
} 

然後我有類我創建列表imagesUrls: 當我運行程序有時我得到異常沒有所有的時間。

遠程服務器返回錯誤:(500)內部服務器錯誤。

System.Net.WebException was unhandled 
    HResult=-2146233079 
    Message=The remote server returned an error: (500) Internal Server Error. 
    Source=System 
    StackTrace: 
     at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) 
     at System.Net.WebClient.DownloadData(Uri address) 
     at System.Net.WebClient.DownloadData(String address) 
     at SatelliteImages.ExtractImages.ExtractDateAndTime(String baseAddress) in D:\C-Sharp\SatelliteImages\SatelliteImages\SatelliteImages\ExtractImages.cs:line 97 
     at SatelliteImages.ExtractImages.Init() in D:\C-Sharp\SatelliteImages\SatelliteImages\SatelliteImages\ExtractImages.cs:line 30 
     at SatelliteImages.Form1..ctor() in D:\C-Sharp\SatelliteImages\SatelliteImages\SatelliteImages\Form1.cs:line 26 
     at SatelliteImages.Program.Main() in D:\C-Sharp\SatelliteImages\SatelliteImages\SatelliteImages\Program.cs:line 19 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

和類代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Xml; 
using HtmlAgilityPack; 

namespace SatelliteImages 
{ 
    class ExtractImages 
    { 
     static WebClient client; 
     static string htmltoextract; 
     public static List<string> countriescodes = new List<string>(); 
     public static List<string> countriesnames = new List<string>(); 
     public static List<string> DatesAndTimes = new List<string>(); 
     public static List<string> imagesUrls = new List<string>(); 
     static string firstUrlPart = "http://www.sat24.com/image2.ashx?region="; 
     static string secondUrlPart = "&time="; 
     static string thirdUrlPart = "&ir="; 

     public void Init() 
     { 
      ExtractCountires(); 
      foreach (string cc in countriescodes) 
      { 
       ExtractDateAndTime("http://www.sat24.com/image2.ashx?region=" + cc); 
      } 
      ImagesLinks(); 
     } 

     public static void ExtractCountires() 
     { 
      try 
      { 
       htmltoextract = "http://sat24.com/en/?ir=true";//"http://sat24.com/en/";// + regions; 
       client = new WebClient(); 
       client.DownloadFile(htmltoextract, @"c:\temp\sat24.html"); 
       client.Dispose(); 

       string tag1 = "<li><a href=\"/en/"; 
       string tag2 = "</a></li>"; 

       string s = System.IO.File.ReadAllText(@"c:\temp\sat24.html"); 
       s = s.Substring(s.IndexOf(tag1)); 
       s = s.Substring(0, s.LastIndexOf(tag2) + tag2.ToCharArray().Length); 
       s = s.Replace("\r", "").Replace("\n", "").Replace(" ", ""); 

       string[] parts = s.Split(new string[] { tag1, tag2 }, StringSplitOptions.RemoveEmptyEntries); 


       string tag3 = "<li><ahref=\"/en/"; 

       for (int i = 0; i < parts.Length; i++) 
       { 
        if (i == 17) 
        { 
         //break; 
        } 
        string l = ""; 
        if (parts[i].Contains(tag3)) 
         l = parts[i].Replace(tag3, ""); 

        string z1 = l.Substring(0, l.IndexOf('"')); 
        if (z1.Contains("</ul></li><liclass=")) 
        { 
         z1 = z1.Replace("</ul></li><liclass=", "af"); 
        } 
        countriescodes.Add(z1); 
        countriescodes.GroupBy(n => n).Any(c => c.Count() > 1); 

        string z2 = parts[i].Substring(parts[i].LastIndexOf('>') + 1); 
        if (z2.Contains("&amp;")) 
        { 
         z2 = z2.Replace("&amp;", " & "); 
        } 
        countriesnames.Add(z2); 
        countriesnames.GroupBy(n => n).Any(c => c.Count() > 1); 
       } 
      } 
      catch (Exception e) 
      { 

      } 
     } 

     public static void ExtractDateAndTime(string baseAddress) 
     { 
      var wc = new WebClient(); 
      wc.BaseAddress = baseAddress; 
      HtmlDocument doc = new HtmlDocument(); 

      var temp = wc.DownloadData("/en"); 
      doc.Load(new MemoryStream(temp)); 

      var secTokenScript = doc.DocumentNode.Descendants() 
       .Where(e => 
         String.Compare(e.Name, "script", true) == 0 && 
         String.Compare(e.ParentNode.Name, "div", true) == 0 && 
         e.InnerText.Length > 0 && 
         e.InnerText.Trim().StartsWith("var region") 
        ).FirstOrDefault().InnerText; 
      var securityToken = secTokenScript; 
      securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push")); 
      securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", ""); 
      var dates = securityToken.Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
      var scriptDates = dates.Select(x => new ScriptDate { DateString = x }); 
      foreach (var date in scriptDates) 
      { 
       DatesAndTimes.Add(date.DateString); 
      } 
     } 

     public class ScriptDate 
     { 
      public string DateString { get; set; } 
      public int Year 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(0, 4)); 
       } 
      } 
      public int Month 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(4, 2)); 
       } 
      } 
      public int Day 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(6, 2)); 
       } 
      } 
      public int Hours 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(8, 2)); 
       } 
      } 
      public int Minutes 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(10, 2)); 
       } 
      } 
     } 

     public void ImagesLinks() 
     { 
      int cnt = 0; 
      foreach (string countryCode in countriescodes) 
      { 
       cnt++; 
       for (; cnt < DatesAndTimes.Count(); cnt++) 
       { 
        string imageUrl = firstUrlPart + countryCode + secondUrlPart + DatesAndTimes[cnt] + thirdUrlPart + "true"; 
        imagesUrls.Add(imageUrl); 
        if (cnt % 10 == 0) break; 
       } 
      } 
     } 
    } 
} 

關於類:

  1. 我應該如何處理異常?我通常想要通過再次嘗試操作來處理,因爲我會每次X更新列表imagesUrls我想要的時候,如果有異常,請再次嘗試操作並且不要停止。

  2. 如何在form1中使用backgroundworker類?因此,當它首次在該類中下載所有文件時,它將在form1 progressBar1和label2上顯示下載進度。

但首先要解決form1代碼中的問題,然後處理該類。

+0

看到我的答案[here](http://stackoverflow.com/questions/41370300/how-can-i-use-two-progressbar-controls-to-display-each-file-download-progress-an/ 41370508#41370508)關於進度條。我還提供了一個詳細的例子來幫助你。 – CodingYoshi

+0

您是否有來自服務器的日誌(或獲取更多詳細信息的方式)?錯誤500是非常通用的。 – EJoshuaS

回答

2

對於您的進度問題:您的行worker.ReportProgress(i * 10);有一個錯誤。 i的範圍可以從0ExtractImages.imagesUrls.Count()。所以,只要我超過10,你的報告就超過了100%。因此,您正在檢查進度條範圍(如果檢查異常的內容,則應該對進度欄值有內部異常= ArgumentException)。

替換worker.ReportProgress(Math.Floor(100*i/ExtractImages.imagesUrls.Count()));,並確保你的進度條最大值爲100

對於第二個問題,您可以識別哪些一行生成錯誤?因爲這是一個Error500,所以在服務器端的問題。除非您有權訪問服務器日誌以識別源代碼,否則必須使用try/catch塊來處理它,並管理有問題的條目(我認爲只是忽略它們,並警告用戶有些條目存在問題是合理的第一種方法)。

相關問題