2012-05-21 2 views
0

Rx 프레임 워크가 비동기 작업에 매우 유용하게 보이지만 많은 페이지를 다운로드 할 때 어떻게 사용할 수 있는지 알 수 없습니다.웹 크롤러를위한 Rx 프레임

이 작업을 나던 당연히 내가이

var en = Enumerable.Range(0,100).Select(x => WebRequest.Create("http://google.com")).Select(x => Observable.FromAsyncPattern<WebResponse>(x.BeginGetResponse, 
    x.EndGetResponse)().Subscribe(r => Console.WriteLine(r.ContentLength))).ToList(); 

같은 쓰기 뭔가를하려합니다. 그것을 올바르게하는 방법?

+0

여기에서 성취하려는 것은 무엇입니까? 실제 시나리오는 무엇입니까? Rx가 올바른 접근 방식이 아닐 수도 있습니다. Task Parallel Library로 충분할 것입니다. – yamen

+0

@yamen이 예제에서는 비동기 적으로 100 페이지를 다운로드하려고합니다. 나는이 작업을 위해 TPL을 사용하는 것에 관한 질문을했고 누군가 tpl이 CPU 바운드 작업에 좋다는 것을 설명했다. I \ O 작업의 경우 비동기 메서드가 더 좋습니다. Well Rx는 비동기 메서드로 작업하기가 쉽습니다. Ofcourse 나는 Rx없이 그것을 할 수 있지만 뭔가 새로운 것을 배우고 싶습니다. – Neir0

+0

합리적인 - VS 11 또는 .NET 4.5 옵션이 있습니까? – yamen

답변

3

편집 : 간단한 오류 처리를 제공하도록 수정되었습니다.

var urls = new[] 
     { 
      "http://stackoverflow.com/questions/10693617/" 
        + "rx-framework-for-a-web-crawler", 
      "http://stackoverflow.com/", 
      "http://stackoverflow.com/users/259769/enigmativity", 
     }; 

Func<string, IObservable<WebResponse>> create = 
    url => 
     Observable.Defer(() => 
     { 
      var wr = WebRequest.Create(url); 
      return 
       Observable 
        .FromAsyncPattern<WebResponse>(
         wr.BeginGetResponse, 
         wr.EndGetResponse) 
        .Invoke() 
        .Catch(Observable.Return<WebResponse>(null)); 
     }); 

var query = 
    from u in urls.ToObservable() 
    from r in create(u) 
    select new 
    { 
     URL = u, 
     ContentLength = r == null ? -1L : r.ContentLength, 
    }; 

ServicePointManager.DefaultConnectionLimit = 100; 

query.Subscribe(x => Console.WriteLine(x)); 

그래도 난 이것보다 더 나은 오류 처리를 제공하기 위하여 경사 될 것이다 :

다음은해야 할 일입니다. 그냥 null 값이 아닌 예외를 포함하는 튜플을 보내야합니다.

+0

감사합니다. 하지만 (404와 같은) 예외가 있다면 그냥 구독을 중단하십시오. 내가 어떻게 그것을 가장 할 수 있니? – Neir0

+0

@ Neir0 - 오류 처리 기능을 추가했습니다. – Enigmativity