你能给我一个WebClient下载网站源代码并异步过滤的例子,以免冻结GUI吗?

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

  •  06-07-2019
  •  | 
  •  

我已经阅读了MSDN上的一些文章,但它们现在还不是我所需要的。

你能告诉我一个简单的应用程序,它以异步方式下载网站(WebClient.DownloadDataAsync),然后过滤网站的TITLE标签吗?

我不能为我的生活做到这一点,我只是想看到一个清晰的模型。

有帮助吗?

解决方案

您可能会发现使用DownloadStringAsync更容易。这样,您可以将HTML解析为字符串,而不必自己处理编码。

至于如何解析标题,您可能会发现更难做,因为.NET没有内置的HTML解析器。您可以尝试使用一些RegEx或使用XMLReader,但如果您的内容格式错误或棘手,则可能会出现问题。

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

其他提示

这是一个使用异步代理的完整解决方案。请注意,我正在使用 Control.Invoke 来确保任何UI交互在主UI线程上执行,在这种情况下显示一个消息框。

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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top