2009-08-21 99 views
0

我有一個呈現項目列表的WPF應用程序。如果特定項目的Web服務器上存在某些信息(我需要下載HTML網頁並驗證其內容以決定是否顯示該圖標),我想在UI中顯示一個圖標。異步收集信息

項目數可能相當大(超過100個),因此同步請求Web服務器可能會凍結應用程序較長時間。我想異步執行並在檢索每條信息後更新UI。處理這個問題的最好方法是什麼?

回答

0

使用BackgroundWorker來完成這項工作。更新ProgressChanged事件處理程序中的UI

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    WebClient wc = new WebClient(); 
    int count = urlsToCheck.Count; 
    for(int i = 0; i < count; i++) 
    { 
     bool urlValid = CheckUrl(url); 
     backgroundWorker1.ReportProgress(100 * (i + 1)/count, new CheckUrlResult(url, urlValid)); 
    } 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    CheckUrlResult result = e.UserState as CheckUrlResult; 
    textBox1.Text += string.Format("{0} : {1}\n", result.Url, result.IsValid); 
    progressBar1.Value = e.ProgressPercentage; 
} 
+0

感謝您的意見。 是否應該有單個BackgroundWorker?我在問,因爲我認爲通過同時向Web服務器發送多個請求來獲得結果可能會更快。 – GUZ 2009-08-21 09:09:55

+0

您可以在應用程序中添加很多BW。 只要想想檢查他們的狀態(IsBusy)並檢查表單是否在完成事件時不被禁用。 – Xstahef 2009-08-21 09:23:21

+0

每個BW是否使用新線程?我想知道,如果創建的線程過多,則爲每個項目添加BW可能會損害性能。 – GUZ 2009-08-21 09:31:46