Pourriez-vous me donner un exemple d'un WebClient téléchargeant le code source d'un site Web et filtrant quelque chose de manière asynchrone pour ne pas geler l'interface graphique?

StackOverflow https://stackoverflow.com/questions/1634665

  •  06-07-2019
  •  | 
  •  

Question

J'ai lu certains articles sur MSDN mais ils ne sont pas tout à fait ce dont j'ai besoin pour le moment.

Pourriez-vous me montrer une application simple qui télécharge un site Web de manière asynchrone (WebClient.DownloadDataAsync) puis filtre la balise TITLE du site?

Je ne peux pas faire cela pour ma vie, et j'essaie simplement de voir un modèle bien défini.

Était-ce utile?

La solution

Vous trouverez peut-être plus facile d'utiliser DownloadStringAsync. De cette façon, vous pouvez analyser le code HTML en tant que chaîne plutôt que de devoir vous coder vous-même.

En ce qui concerne la manière d’analyser le titre, vous pouvez trouver cela un peu plus difficile, car .NET n’a pas d’analyseur HTML intégré. Vous pouvez essayer un RegEx ou utiliser XMLReader, mais cela peut poser problème si vous avez un contenu mal formé ou délicat.

var client = new WebClient();
client.DownloadStringCompleted += (s, args) => {
    if (args.Error == null && !args.Cancelled) {
        var regex = new Regex("<title>(?<title>.*?)</title>");
        var match = regex.Match(args.Result);
        if (match.Success)
        {
            var myTitle = match.Groups["title"].Value;
            // ... 
        }
    }
};
client.DownloadStringAsync(url);

Autres conseils

Voici une solution complète utilisant les délégués asynchrones . Notez que j'utilise Control.Invoke pour garantir que toutes les interactions de l'interface utilisateur sont exécutés sur le fil principal de l'interface utilisateur, affichant dans ce cas une boîte de message.

var button = new Button {Text = "Run"};
button.Click +=
    (sender, e) =>
        {
            var fetchTitle = new Func<string, string>(
                address =>
                    {
                        var html = new WebClient().DownloadString(address);
                        var match = Regex.Match(html, "<title>(.*)</title>");
                        return match.Groups[1].Value;
                    });
            var displayTitle = new Action<string>(
                title => MessageBox.Show(title));
            fetchTitle.BeginInvoke(
                "http://stackoverflow.com",
                result =>
                    {
                        var title = fetchTitle.EndInvoke(result);
                        if (button.InvokeRequired)
                        {
                            button.Invoke(displayTitle, title);
                        }
                        else
                        {
                            displayTitle(title);
                        }
                    },
                null);
        };
new Form {Controls = {button}}.ShowDialog();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top