我已经阅读了MSDN上的一些文章,但它们现在还不是我所需要的。
你能告诉我一个简单的应用程序,它以异步方式下载网站(WebClient.DownloadDataAsync),然后过滤网站的TITLE标签吗?
我不能为我的生活做到这一点,我只是想看到一个清晰的模型。
答案 0 :(得分:3)
您可能会发现使用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);
答案 1 :(得分:2)
以下是使用asynchronous delegates的完整解决方案。请注意,我使用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();