2

단추를 클릭 할 때 쫓기고있는 간단한 비동기 작업을 만들었습니다. 전체 코드는 다음과 같습니다.

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


  • BTW 거기에 새로운HttpClient 클래스.NET 용으로 설계된 4.5async/await. - dtb
  • @ dtb 나는 그것을 알고있다. 고마워,하지만 여기 문제는 다르다. - tugberk
  • 얼마나 걸리나요?htmlString? 렌더링하는 데 약간의 시간이 걸릴 수 있습니다.txtBlock1그것으로. - dtb
  • @ dtb 당신이 그 새것을 생각해?WebClient그 차단을 일으킬까요? - tugberk
  • 아니,WebClient인스턴스는 정말 가볍습니다. 얼마나 오래 확인 했니?htmlString위의 내 코멘트를 참조하십시오? - dtb

1 답변


4

WebClient용도HttpWebRequest, 불행히도비동기 적이 지 않다.심지어 "비동기"메서드를 사용하는 경우에도 마찬가지입니다. 그것은 최소한 DNS 룩업을 차단합니다. 또한 프록시 협상 및 / 또는 초기 HTTP 연결 중 차단 될 수 있습니다.

이전 버전의HttpClient방금 래퍼를 사용하고있었습니다.HttpWebRequest. 나는진정으로 비동기를 요구했다.HttpClient, 그러나 결코 응답을 들었다. 내가 마지막으로 확인했을 때HttpClient, 그것은 여전히 MVC의 일부였습니다. ASP.NET 웹 API는 그 당시에 있지 않았기 때문에 수정되었을 수 있습니다.HttpClient그때부터.또는사이의 행동의 차이WebClientHttpClient귀하의 컴퓨터에 DNS 캐시 또는 일부와 관련이있을 수 있습니다.


  • 다운로드 방법 (처리기가 아님)의 내부에서 특정 연속이 UI 스레드에 있어야하기 때문에 ConfigureAwait (false)해야합니까? 분명히 처리기가 그렇게해서는 안됩니다. :) - James Manning
  • 나는 할 것이다. 그렇게하는 것이 가장 좋은 방법이지만, (이 경우) 교착 상태와 같은 문제가 발생하지 않으면 효율적이지 않습니다. 있다. - Stephen Cleary
  • 나는 질문자가 HttpClient가 위대한 ' 참으로 &fixed; 네가 좋아하는대로? - Simon_Weaver
  • 나는 그것이 고쳐지지 않았다고 믿는다. 나는 dotPeek에서 그것을 검사했고 같은 호출 구조가 존재한다. (HttpClient- >HttpWebRequest- >ServicePoint- > DNS 요청 차단). - Stephen Cleary

연결된 질문


관련된 질문

최근 질문