¿Podría darme un ejemplo de un WebClient descargando el código fuente de un sitio web y filtrando algo de forma asincrónica para no congelar la GUI?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

He leído algunos de los artículos sobre MSDN pero no son lo que necesito en este momento.

¿Podría mostrarme una aplicación simple que descargue un sitio web de forma asincrónica (WebClient.DownloadDataAsync) y luego filtre la etiqueta TITLE del sitio?

No puedo hacer esto por mi vida, y solo estoy tratando de ver un modelo claro.

¿Fue útil?

Solución

Puede resultarle más fácil usar DownloadStringAsync. De esa manera, puede analizar el HTML como una cadena en lugar de tener que lidiar con la codificación usted mismo.

En cuanto a cómo analizar el título, es posible que sea un poco más difícil de hacer, ya que .NET no tiene un analizador HTML incorporado. Puede probar RegEx o usar XMLReader, pero pueden ser problemáticos si tiene contenido malformado o complicado.

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

Otros consejos

Aquí hay una solución completa que utiliza delegados asincrónicos . Tenga en cuenta que estoy usando Control.Invoke para garantizar que cualquier interacción de la interfaz de usuario se realizan en el hilo principal de la interfaz de usuario, en este caso mostrando un cuadro de mensaje.

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top