2013-07-22 4 views
0

내 코드의 가장 느린 부분이 선이 바로 여기에 있습니다 :프로그램 속도를 높이기 위해 webRequest를 백그라운드에 "대기"할 수 있습니까?

 string responseString; 
     var webRequest = WebRequest.Create(url); 
     using (var response = webRequest.GetResponse()) 
     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      responseString = sr.ReadToEnd(); 
     } 
     return responseString; 

여러 WebRequest 클래스 "대기열"을 내 코드가 페이지 요청 사이의 HTML을 구문 분석하는 동안 그들이 백그라운드에서 다운로드가 할 수있는 방법이있다? 내가 할 수있는 이름/방법이 있나요? 모든 링크 또는 코드가 많이 감사드립니다! 감사!

* 편집 : 전체 getHTML() 코드는 당신이 당신의 UI를 차단하기 위해, 비동기 방법을 사용하고이 요청을 처리 할 수 ​​

+0

제목에는 C#이 필요하지 않습니다. – rene

+1

당신은 [async] 갈 수 있습니다 (http://msdn.microsoft.com/en-us/library/86wf6409 (v = vs.110) .aspx) – rene

답변

3

을 추가했다.

하지만 게시 된 코드 줄은 거의 아무것도 수행하지 않아야합니다. 응답을 호출 할 때 서버에 대한 요청이 발생합니다. 함께 :

var respone = webRequest.GetResponse(); 

그냥 비동기 progresss IST 수행 된 UI를 차단 해제 후에 그것을 처리하기 위해 사용합니다.

var response = webRequest.GetResponseAsync(); 
// or BeginResponse() ... EndResponse(); 

당신은 자세한 내용은 다음 읽을 수 있습니다 : http://msdn.microsoft.com/en-us/library/86wf6409(v=vs.110).aspx

+0

이것은 정말 시작에 불과합니다 ... – Servy

+0

언제든지 확장 할 수 있습니다. 네 마음에 대한 나의 대답은 기뻐한다. –

+0

나는 그렇게했다. – Servy

1

은 당신이 찾고있는 프로그램의 프로듀서 소비자 스타일입니다. 언제든지 BlockingCollection이 좋은 도구라는 것을 알 수 있습니다. 그것은 여러 스레드에서 안전하게 액세스하도록 설계된 콜렉션 (기본적으로 대기열 사용)입니다.

당신은 비동기 요청을하고 대기열에 요청의 결과를 가하고 있습니다 귀하의 고객으로 시작 할 수 있습니다

BlockingCollection<string> queue = new BlockingCollection<string>(); 

foreach(string url in links) 
    var webRequest = WebRequest.Create(url); 
    webRequest.GetRequestStreamAsync() 
     .ContinueWith(t => new StreamReader(t.Result).ReadToEnd()); 

그런 다음 대기열에서 각 결과를 처리하는 코드를 가질 수

그들이 들어올 때 한 명 이상은 쉽게 이해할 수 있습니다.

foreach(var fileText in queue.GetConsumingEnumerable()) 
{ 
    processText(fileText); 
} 
관련 문제