2011-08-11 2 views
1

백그라운드에서 WebBrowser 컨트롤 (WPF)을 사용하여 웹 사이트를 다운로드하고 나중에 사이트를 구문 분석하려고합니다. 다운로드는 " 빡빡한 루프에 있어야합니다. 나는 단지 문자열로 소스가 필요합니다. 결과를주지 않은 다음 코드로 시도했습니다. StaTaskScheduler와 함께 사용하지 않으면 FREEZ 루프 동안. 어떤 아이디어?StaTaskScheduler (TPL 확장) 및 WebBrowser 컨트롤 WPF - 틀린 스레드

StaTaskScheduler sta = new StaTaskScheduler(numberOfThreads: 1); 
private void Button1_Click(object sender, RoutedEventArgs e) 
     { 
    for (int i = 0; i < 2; i++) 
      { 
       Task.Factory.StartNew(() => 
       { 
        WebBrowser wb3 = new WebBrowser(); 
        wb3.Source = new Uri("MyURL"); 
        n++; 
        wb3.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted); 
       }, CancellationToken.None, TaskCreationOptions.None, sta); 
      } 
     } 

void wb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 

WebBrowser w = sender as WebBrowser; 
    HtmlDocument document = new HtmlDocument(w.Document); 

blockingCollection.Add(document.Body.OuterHtml); 

     Task.Factory.StartNew(
      () => 
      { 
       while (!blockingCollection.IsCompleted) 
       { 
        string dlcode; 
        Thread.Sleep(500); 
        if (blockingCollection.TryTake(out dlcode)) 
        { 
    // tb is a TextBox 
         Dispatcher.BeginInvoke(new Action(() => { tb.Text = dlcode; })); 
        } 
       } 
      }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); 

}

답변

2

나는이에 대한 WebBrowser를 사용하지 않는 것이 좋습니다 것이 아니라 단지 직접 WebClient을 사용합니다. 이것은 가장 쉬운 수행 감사합니다 다운로드 데이터를 랩핑하는 루틴 만들기 작업 :

Task<string> DownloadStringAsync(Uri address) 
{ 
    TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); 
    WebClient client = new WebClient(); 

    // Note that you can add error checking here by looking at e.Error/etc, and setting the cancel/error in tcs appropriately... 
    client.DownloadStringCompleted += (o,e) => tcs.SetResult(e.Result); 
    client.DownloadStringAsync(address); 

    return tcs.Task; 
} 

이렇게하면 이러한 작업을 직접 사용하고 완료시 결과를 BC로 설정할 수 있습니다. 이는 시각적 용도로 사용하기 위해 WebBrowser 컨트롤을 돌리는 것보다 훨씬 간단합니다.

+0

리드가 맞습니다. WebBrowser에는 UI 스레드와 상호 작용할 수있는 시각적 요소가 있습니다 (표시하지 않더라도). –

+0

답장을 보내 주셔서 감사합니다.하지만 문제는 내 사이트가 콘텐츠를 동적으로로드하는 ASP.NET 사이트이고 정상적인 HTTP 요청을 사용하면 콘텐츠가없는 빈 문자열이 표시된다는 것입니다. 죄송하지만이 점을 잊어 버렸습니다. 그래서이 솔루션을 사용하고 싶습니다. 그러나 나는 또한 빠른 해결책이 필요하다. 그리고 나에게 그것은 다소 느렸다. 이 문제를 해결할 다른 아이디어가 있다면 나는 매우 행복 할 것이다. 나는 지금 손실에있어 : ​​( – user774326

+0

어쩌면 MSHMTL을 사용하여 웹 사이트를 완전히 다운로드하고 문자열을 소스로 반환 할 수 있습니까? 즉, "엔진을 사용하여 사이트를 해석하지 않고"표시하지 않고 그대로 사용할 수 있습니까? – user774326