我有一个呈现项目列表的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