2011-08-11 13 views
1

WebBrowserコントロール(WPF)をバックグラウンドでダウンロードし、後でそのサイトを解析したいと考えています。ダウンロードは"タイトループにする必要があります。私は文字列としてソースが必要です。私は結果を与えていない次のコードで試しました 私はStaTaskSchedulerでそれを使用しないと、 FREEZループ中。 任意のアイデア?StaTaskScheduler(TPL Extension)と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を使用します。これは、最も簡単で行われているありがとうダウンロードデータをaタスク:

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完了時にBCに設定することができます。これは、視覚的な使用を目的としたWebBrowserコントロールの回転を試みるよりもはるかに簡単です。

+0

リードが正しいです。 WebBrowserには、表示されていなくても、UIスレッドと対話するためのビジュアル要素があります。 –

+0

ありがとうございます。私のサイトはコンテンツを動的に読み込むASP.NETサイトであり、通常のHTTPリクエストを使用するとコンテンツなしで空の文字列が得られるという問題があります。 申し訳ありませんが、私はこれについて言及するのを忘れました。だからこそ私はこのソリューションを使いたいのです。しかし、私は高速な解決策も必要としています。そして私にとっては、それはむしろ遅かったです。あなたがこの問題を解決する別の考えを持っているなら、私はとても幸せだろう。私は今失っている:( – user774326

+0

多分MSHMTLを使用して、完全にウェブサイトをダウンロードし、文字列としてのソースを返すことは可能ですか?それはそれを表示せずに "エンジンを解釈するために"使用することを意味する? – user774326

関連する問題