Сбор информации из Интернета асинхронно - PullRequest
0 голосов
/ 21 августа 2009

У меня есть приложение WPF, которое представляет список элементов. Я хотел бы показать значок в пользовательском интерфейсе, если на веб-сервере существует определенная информация для данного элемента (мне нужно скачать веб-страницу HTML и проверить ее содержимое, чтобы решить, следует ли отображать значок или нет).

Количество элементов может быть довольно большим (более 100), поэтому синхронный запрос веб-сервера может заморозить приложение на более длительное время. Я хотел бы сделать это асинхронно и обновлять пользовательский интерфейс после получения каждой части информации. Как лучше всего решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 21 августа 2009

Используйте BackgroundWorker для выполнения работы. Обновите пользовательский интерфейс в обработчике событий ProgressChanged

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 голосов
/ 21 августа 2009

Использование Backgroundworkers - хороший способ решить вашу проблему Это легко использовать: Вы запускаете асинхронную операцию без остановки приложения и получаете уведомление о завершении асинхронной операции.

Некоторые примеры здесь: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx http://channel9.msdn.com/forums/TechOff/252416-C-and-WPF-progressbar/

MSDN определение BW: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...