C# 从Internet异步获取信息

C# 从Internet异步获取信息,c#,asynchronous,C#,Asynchronous,我有一个WPF应用程序,它提供了一个项目列表。我想在UI中显示图标,如果某个给定项目的web服务器上存在某些信息,我需要下载HTML网页并验证其内容,以决定是否应显示图标 项目的数量可能超过100个,因此同步请求web服务器可能会使应用程序冻结更长的时间。我希望异步执行此操作,并在检索每一条信息后更新UI。处理此问题的最佳方法是什么。使用Backgroundworker是解决问题的好方法 它易于使用: 您在不冻结应用程序的情况下运行asyn操作,操作asyn完成时会收到通知 这里有一些例子:

我有一个WPF应用程序,它提供了一个项目列表。我想在UI中显示图标,如果某个给定项目的web服务器上存在某些信息,我需要下载HTML网页并验证其内容,以决定是否应显示图标


项目的数量可能超过100个,因此同步请求web服务器可能会使应用程序冻结更长的时间。我希望异步执行此操作,并在检索每一条信息后更新UI。处理此问题的最佳方法是什么。

使用Backgroundworker是解决问题的好方法 它易于使用: 您在不冻结应用程序的情况下运行asyn操作,操作asyn完成时会收到通知

这里有一些例子:

MSDN BW的定义:

希望这能有所帮助。

请找一位背景工作人员来做这项工作。更新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;
}

谢谢你的想法。是否应该只有一个后台工作人员?我这样问是因为我认为同时向web服务器发出多个请求可能会更快地获得结果。你可以在应用程序中添加大量BW。只需考虑检查它们的状态是否繁忙,并检查窗体在完成事件时是否未禁用。每个BW是否使用新线程?我想知道,如果创建的线程太多,那么为每个项目添加一个BW可能会损害性能。是的,每个BW都使用一个新线程。您可以使用多个BW,您只需要处理一个请求队列来处理并将它们分派到下一个可用的BW。另一种选择是使用ThreadPool类,但是使用起来有点困难,因为您必须使用invoke在UI线程上执行访问UI的代码。