Potresti darmi un esempio di un client Web che scarica un codice sorgente del sito Web e filtra qualcosa in modo asincrono per non bloccare la GUI?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Ho letto alcuni articoli su MSDN ma non sono proprio quello di cui ho bisogno in questo momento.

Potresti mostrarmi una semplice applicazione che scarica un sito Web in modo asincrono (WebClient.DownloadDataAsync) e quindi filtra il tag TITLE del sito?

Non posso farlo per la mia vita, e sto solo cercando di vedere un modello chiaro.

È stato utile?

Soluzione

Potrebbe essere più semplice utilizzare DownloadStringAsync. In questo modo, puoi analizzare l'HTML come una stringa anziché dover gestire la codifica.

Per quanto riguarda come analizzare il titolo, potresti scoprire che è un po 'più difficile da fare, poiché .NET non ha un parser HTML incorporato. Potresti provare un po 'di RegEx o usare XMLReader, ma questi possono essere problematici se hai contenuti non validi o difficili.

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

Altri suggerimenti

Ecco una soluzione completa che utilizza delegati asincroni . Si noti che sto utilizzando Control.Invoke per garantire che le interazioni dell'interfaccia utente vengono eseguiti sul thread dell'interfaccia utente principale, in questo caso viene visualizzata una finestra di messaggio.

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top