Können Sie mir ein Beispiel einer WebClient geben eine Website-Quellcode herunterladen und etwas Filterung asynchron nicht die GUI einzufrieren?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe einige Artikel auf MSDN lesen, aber sie sind nicht ganz das, was ich jetzt brauche.

Könnten Sie mir zeigen eine einfache Anwendung, die eine Website heruntergeladen asyncchronously (WebClient.DownloadDataAsync) und filtert dann den Titel-Tag der Seite?

Ich kann das nicht für das Leben von mir, und ich versuche nur, einen klaren Schnitt Modell zu sehen.

War es hilfreich?

Lösung

Sie können es einfacher finden, DownloadStringAsync zu verwenden. Auf diese Weise können Sie den HTML-Code als Zeichenfolge analysieren, anstatt mit kodieren selbst zu beschäftigen.

Was wie der Titel zu analysieren, finden Sie möglicherweise, dass ein bisschen schwieriger, zu tun, da .NET keinen integrierten HTML-Parser. Sie könnten einige RegEx versuchen oder XMLReader verwenden, aber diejenigen, kann problematisch sein, wenn Sie oder knifflige Inhalt malformed haben.

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);

Andere Tipps

Hier ist eine komplette Lösung, die verwendet asynchron Delegierten . Beachten Sie, dass ich bin mit Control.Invoke , um sicherzustellen, dass alle UI-Interaktionen auf dem Haupt-UI-Thread ausgeführt wird, in diesem Fall ein Meldungsfeld angezeigt wird.

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top