단추를 클릭 할 때 쫓기고있는 간단한 비동기 작업을 만들었습니다. 전체 코드는 다음과 같습니다.
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private async void Button_Click_1(object sender, RoutedEventArgs e) {
var htmlString = await DowloadPage("http://example.com");
txtBlock1.Text = htmlString;
}
public async Task<string> DowloadPage(string uri) {
using (WebClient client = new WebClient()) {
var htmlString = await client.DownloadStringTaskAsync(uri);
return htmlString;
}
}
}
아주 쉽게. 그러나 단추를 클릭하면 UI 스레드에서 반응이 없습니다. 페이지를 다운로드하는 동안 창 주위를 이동하려고 할 수 없습니다.
어떤 생각이 잘못 되었습니까?
편집하다:
나는 .NET 4.5에서 HttpClient를 사용해 보았는데 예상대로 잘 수행되었다.
public async Task<string> DowloadPage(string uri) {
using (HttpClient client = new HttpClient()) {
var response = await client.GetAsync(uri);
var htmlString = await response.Content.ReadAsStringAsync();
return htmlString;
}
}
WebClient
용도HttpWebRequest
, 불행히도비동기 적이 지 않다.심지어 "비동기"메서드를 사용하는 경우에도 마찬가지입니다. 그것은 최소한 DNS 룩업을 차단합니다. 또한 프록시 협상 및 / 또는 초기 HTTP 연결 중 차단 될 수 있습니다.
이전 버전의HttpClient
방금 래퍼를 사용하고있었습니다.HttpWebRequest
. 나는진정으로 비동기를 요구했다.HttpClient
, 그러나 결코 응답을 들었다. 내가 마지막으로 확인했을 때HttpClient
, 그것은 여전히 MVC의 일부였습니다. ASP.NET 웹 API는 그 당시에 있지 않았기 때문에 수정되었을 수 있습니다.HttpClient
그때부터.또는사이의 행동의 차이WebClient
과HttpClient
귀하의 컴퓨터에 DNS 캐시 또는 일부와 관련이있을 수 있습니다.
HttpClient
- >HttpWebRequest
- >ServicePoint
- > DNS 요청 차단). - Stephen Cleary
async
/await
. - dtbhtmlString
? 렌더링하는 데 약간의 시간이 걸릴 수 있습니다.txtBlock1
그것으로. - dtbWebClient
그 차단을 일으킬까요? - tugberkWebClient
인스턴스는 정말 가볍습니다. 얼마나 오래 확인 했니?htmlString
위의 내 코멘트를 참조하십시오? - dtb