2011-08-11 3 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

WebBrowserは既に非同期ですが、とすれば、はUIスレッドでスクリプトを実行します。

あなたが本当に別のスレッドにそれをオフに分割したい場合は、STAThreadSchedulerを使用することができます。ウェブサイトごとに1つのスレッド(STA)が必要なように思えます。

+0

すぐにお返事ありがとうございます。私が以前に聞いたことのないSTAThreadScheduler ...私は初心者です... 最初の文章は、すでに私がTPLコードを追加しなくてもやりたいことを意味していますか?コントロールは、UIスレッド上で何も実行する必要はありません。後で解析コンテンツをグリッドに追加します。他の活動を中断することなく、バックグラウンドで仕事に忙しいだけです。 – user774326

+0

正しい。 'WebBrowser'は、バックグラウンドでWebページをダウンロードし、完了したら' LoadCompleted'イベントを発生させます。 WebBrowser'は、UIスレッド上でスクリプトコードの多くを実行している 'ない限り、TPLは必要ありません(私はそれがでしょうかスクリプトコードがあまりにも、バックグラウンドで実行されるかどうかはわかりません)。 –

+0

ありがとうございます、私はまだ2つの追加の質問があります:それを動作させるために、StackPanelなどにコントロールを追加する必要があります。 20個のWebSitesが必要な場合は、20個のコントロールを追加する必要があります。それをXAMLコードに追加する必要がありますか、それを回避する方法がありますか。 2つ目は次のとおりです。プロセスを高速化するために、ダウンロード時に特定の画像などをブロックできますか?私の場合は、サイト全体が読み込まれるまでに時間がかかることがありますが、サイト全体は必要ありません。事前にありがとう – user774326

関連する問題