2011-08-11 4 views
0

다음과 같은 문제가 있습니다. WebBrowser 컨트롤 (WPF)을 사용하여 백그라운드에서 웹 사이트를 다운로드하고 나중에 사이트를 구문 분석하려고합니다. 다운로드는 "엄격한 루프"에 있어야합니다. 나는 그 페이지를 표시 할 필요가 없다. HTML 소스는 문자열로만 필요합니다. 문제는 사이트가 동적으로로드 된 후에 JavaScript로 콘텐츠를 추가한다는 것입니다. 그래서이 방법을 사용합니다. 이것은 실제로 여러 사이트에서 동시에 작동해야합니다.WPF TPL WebBrowser 컨트롤 오류 : 호출 스레드가 STA 여야합니다.

다음 코드에는 "많은 UI 구성 요소에이 기능이 필요하므로 호출하는 스레드가 STA 여야합니다."라는 오류가 있습니다.

TaskScheduler를 현재 컨텍스트로 변경하면 오류 메시지가 표시됩니다.

하지만 백그라운드에서 HTML 소스를 다운로드하려면 어떻게해야합니까?

추가 예를 들어. StackPanel 추가 기능이 작동하지 않습니다.

stackpanel.Children.Add(wb2); 

아이디어가 있으십니까?

은 사전에 감사

private void Button1_Click(object sender, RoutedEventArgs e) 
     {Task.Factory.StartNew(
        () => 
        { 
         WebBrowser wb2 = new WebBrowser(); // That's where I get the error essage 
         wb2.Source = new Uri(MySite); 
         wb2.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted); 

        }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); 
      } 
     } 

void wb_LoadCompleted(object sender, NavigationEventArgs e) 
     { 
      WebBrowser w = sender as WebBrowser; 
      HtmlDocument document = new HtmlDocument(w.Document); 

UPDATE

나는 그럼에도 불구하고 어떤 UI 업데이트를 얻을 수없는 StaTaskScheduler와 같이 그것을 시도 내 실수이고 여분의 스레드를 하지요 모든 DEAS

StaTaskScheduler (TPL Extension) and WebBrowser Control WPF - Wrong Thread

고마워요!

+0

내 지역이 아니기 때문에 "대답"하고 싶지 않습니다. 아마도 귀하의 LoadedCompleted 콘텐츠를 파견해야 할 것입니다. Task 나 WebBrowser를 사용하지 않았습니다. 그냥 추측합니다 :) WPF 방식 인 Background에서 뭔가를로드하는 또 다른 방법은 BackgroundWorker를 사용하는 것입니다. – dowhilefor

+0

답변 해 주셔서 감사합니다. 이 경우 TPL은 Backgroundworker 등을 대체해야합니다. WebBrowser에서 오류 메시지가 표시됩니다. wb2 = new WebBrowser(); – user774326

답변

0

은 이미 비동기이지만, 이 UI 스레드에서 스크립트를 실행합니다.

정말로 분리 된 스레드로 분리하려는 경우 STAThreadScheduler을 사용할 수 있습니다. 웹 사이트마다 하나의 (STA) 스레드가 필요한 것 같습니다.

+0

빠른 답변 주셔서 감사합니다. 내가 들어 본 적이없는 STAThreadScheduler ... 저는 초급자입니다 ... 첫 번째 문장은 이미 TPL 코드를 추가하지 않고도 원하는 것을 수행한다는 의미입니까? 컨트롤은 UI 스레드에서 아무 것도 실행할 필요가 없습니다. 나중에 구문 분석 컨텐츠를 그리드에 추가합니다. 다른 활동을 방해하지 않고 백그라운드에서 일을 시작하기 만하면됩니다. – user774326

+0

맞습니다. 'WebBrowser'는 백그라운드에서 웹 페이지를 다운로드하고 완료되면'LoadCompleted' 이벤트를 발생시킵니다. TPL은'WebBrowser'가 UI 스레드에서 많은 스크립트 코드를 실행하지 않는 이상 필요하지 않습니다. (스크립트 코드가 백그라운드에서 실행될 지 확실하지 않습니다.) –

+0

고마워요. 아직 2 가지 질문이 있습니다. 컨트롤을 StackPanel 등에 추가해야 작동합니다. 20 개의 웹 사이트가 필요하다면 20 개의 컨트롤을 추가해야합니다.XAML 코드에 추가해야합니까? 아니면 주위에 방법이 있습니까? 두 번째 이유는 다음과 같습니다. 프로세스 속도를 높이기 위해 다운로드 할 때 특정 이미지 나 유사한 것을 차단할 수 있습니까? 내 경우에는 전체 사이트가로드 될 때까지 가끔씩 시간이 오래 걸리지 만 사이트 전체가 필요하지는 않습니다. 미리 감사드립니다. – user774326

관련 문제