我有一個呈現項目列表的WPF應用程序。如果特定項目的Web服務器上存在某些信息(我需要下載HTML網頁並驗證其內容以決定是否顯示該圖標),我想在UI中顯示一個圖標。異步收集信息
項目數可能相當大(超過100個),因此同步請求Web服務器可能會凍結應用程序較長時間。我想異步執行並在檢索每條信息後更新UI。處理這個問題的最好方法是什麼?
我有一個呈現項目列表的WPF應用程序。如果特定項目的Web服務器上存在某些信息(我需要下載HTML網頁並驗證其內容以決定是否顯示該圖標),我想在UI中顯示一個圖標。異步收集信息
項目數可能相當大(超過100個),因此同步請求Web服務器可能會凍結應用程序較長時間。我想異步執行並在檢索每條信息後更新UI。處理這個問題的最好方法是什麼?
使用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;
}
使用Backgroundworkers是解決你的問題 一個很好的方法可以很容易使用: 您運行不凍結你的應用的ASYN操作,當操作ASYN完成後,你會收到通知。
這裏有些爲例: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx http://channel9.msdn.com/forums/TechOff/252416-C-and-WPF-progressbar/
BW的MSDN定義: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx
希望這有助於。
感謝您的意見。 是否應該有單個BackgroundWorker?我在問,因爲我認爲通過同時向Web服務器發送多個請求來獲得結果可能會更快。 – GUZ 2009-08-21 09:09:55
您可以在應用程序中添加很多BW。 只要想想檢查他們的狀態(IsBusy)並檢查表單是否在完成事件時不被禁用。 – Xstahef 2009-08-21 09:23:21
每個BW是否使用新線程?我想知道,如果創建的線程過多,則爲每個項目添加BW可能會損害性能。 – GUZ 2009-08-21 09:31:46