웹 사이트 소스 코드를 다운로드하고 GUI를 동결하지 않기 위해 비동기 적으로 필터링하는 웹 클리어의 예를 알려 주시겠습니까?
-
06-07-2019 - |
문제
나는 MSDN의 기사 중 일부를 읽었지만 지금은 내가 지금 필요한 것이 아닙니다.
웹 사이트를 비동기 적으로 다운로드 한 간단한 응용 프로그램 (WebClient.DownloadDataAsync)을 표시 한 다음 사이트의 제목 태그를 필터링 할 수 있습니까?
나는 내 인생을 위해 이것을 할 수 없으며, 나는 단지 명확한 컷 모델을 보려고 노력하고 있습니다.
해결책
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);
다른 팁
다음은 사용하는 완전한 솔루션입니다 비동기 대표. 내가 사용하고 있음을 주목하십시오 컨트롤 메인 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();
제휴하지 않습니다 StackOverflow