2009-08-21 135 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