2012-05-01 12 views
0

初めて(VB).NETでWPFに入り込み、MS Access VBAを開始したプロジェクトを再作成しようとしています。基本的には、Webアプリケーション内で一連のページをスクラップします。あなたが推測しているように、私はLoadCompletedイベントに問題があります。複数のNavigate()呼び出しの間にWebBrowserが完全にロードされるのを待つ

私はそれについていくつかの情報を検索して見つけましたが、コードの "流れ"は、1ページが読み込まれるのを待つことに役立ちます。たとえば:

http://social.msdn.microsoft.com/Forums/nn-NO/wpf/thread/52c1bc55-dd41-468c-8759-a42726635d4b

コード実行のすべては、あなただけの1ページに移動し、コードを実行する必要がある場合に正常に動作DocumentLoadedイベントで実行されます。しかし、私は自分のアプリケーションのためにこれらの一連のサイクルを実行する必要があります。

どのようにして、同じサブでコードが実行されたままでドキュメントが完全に読み込まれ、UIスレッドがロックされないようにするにはどうすればよいですか?

ここに私がしようとしていることの基本的な考えがあります。 .NETは私にとって非常に新しいです - 完全

PSを繰り返し、

  • ページにコンテンツ
  • 移動を行う
  • リンスをロードするページについて

    1. 移動
    2. ページを待ちます私の脳にスタックオーバーフローを与えないでください)

      ありがとう、 ブライアン

      - ## EDIT ## -

      これは私がVBAで行うために使用するものです。これはまさに私がやろうとしていることです。ちょうど ".NET"の方法で、UIスレッドをブロックすることなくです。

      Dim oIE = New SHDocVw.InternetExplorer 
      
           With oIE 
            .Navigate(strURL) 
            .Visible = False 
      
      
            ' loop until the page finishes loading 
            Do While oIE.Busy : Loop 
            Do While oIE.ReadyState <> 4 : Loop 
      
            'Code goes here to read DOM, get fields and click a button (logging in to site) 
            'My code execution is done and now I'm ready to go to the next page and read the DOM 
      
            .Navigate(strURL) 
      
           End With 
      

      。 。 。

      これだけです。 n回繰り返す。私のDOMとの相互作用は大きく異なっています。

  • 答えて

    1

    LoadCompletedハンドラの最後にもう一度Navigateを呼び出します。次に、ウィンドウスコープの変数を使用してターゲットURLを追跡すると思います。

    List<string> _urls; 
    int _i = 0; 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
        _urls = new List<string>() { url1, url2, url3 }; // URLs to navigate 
        webBrowser1.LoadCompleted += webBrowser1_LoadCompleted; 
        webBrowser1.Navigate(_urls[_i]); 
    } 
    void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
        // do stuff 
    
        i++; 
        var nextUrl = _urls[i]; 
        webBrowser1.Navigate(nextUrl); 
    } 
    

    EDIT

    たぶん、このようなものがより適切であろう。各サイクルの後、次のURLとそのハンドラを設定することができます。

    class NavIteration 
    { 
        public string Url { get; set; } 
        public delegate void HandleResult(object sender, NavigationEventArgs e); 
        public HandleResult ResultHandler { get; set; } 
    } 
    
    NavIteration CurrentIteration; 
    
    void setNextIteration() 
    { 
        CurrentIteration = null; 
        CurrentIteration = new NavIteration() { 
         Url = someurl, 
         ResultHandler = (sender, e) => { 
          // handle 
         } 
        }; 
    } 
    
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
        webBrowser1.LoadCompleted += webBrowser1_LoadCompleted; 
        setNextIteration(); 
        webBrowser1.Navigate(); 
    } 
    
    void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
        CurrentIteration.ResultHandler(sender, e); 
        setNextIteration(); 
        webBrowser1.Navigate(CurrentIteration.Url); 
    } 
    
    +0

    dbaseman、返信ありがとうございます。残念ながら、私がナビゲートしているURLはわかりません。言い換えれば、必要なURLの数とURL自体は、各「サイクル」後に動的に生成されます – brian

    +0

    @brian gotcha。それは原理的に同じではないでしょうか? ** getNextUrl()**の実装をいくつか呼び出すだけです。 – McGarnagle

    +0

    ああ、そうだ。あなたは、私がリストを反復している間に、その場でアイテムをリストに追加できると言っています。しかし、各URLの私の行動(コード)は異なります。私はちょうど巨大なSELECT ...各URLを扱うケースを持っているつもりですか?リストの次のページになるまで私はURLを知らないので、ブラウザの現在のURLを適切なコードブロックにどのように一致させることができますか?私は十分に質問をしてくれることを願っています。私はあなたの時間を助けてくれてありがとう。ありがとうございました。 – brian

    0

    たぶん私は遠く離れていますが、私はBackGroundWorkerに「ものを行う」でしょう。プライマリスレッドは何もせずにページを探します。 「ものをする」が見つけるよりも遅い場合、スロットルは次に見つける。

    WebClientをStringまたはByte配列にダウンロードしてからDOMに変換することを検討しましたか。 IEに何か必要なものはありますか?

    +0

    こんにちはBlam - この場合の「もの」は、ブラウザのDOMからデータをスクレイピングしています。 BGWがどのように役立つのか分かりません。どんなスレッドで実行されても、IEが完全にロードされるのを待つ必要があります。 WebBrowserへの複数の呼び出しを行い、それをすべてイベントハンドラにダンプアウトすることは、私にとってこれを困難にしています。 – brian

    +0

    @brian更新された回答を参照してください。あなたがBGW上のものがどのように役立つのかわからないなら、私はあなたを助けることができないのか疑問です。 – Paparazzi

    +0

    たぶん私はあなたが何を提案しているのか分かりません。私は.NETへの5日間です。したがって、ボタンのクリックイベントでは、ページに移動するようにコードします。その後、BGWを "実行"してページのDOMを読み取ります。私はまだ同じ問題を抱えています。ブラウザの読み込みが完了するまでDOMの読み込みを開始できません。同時に2つのことをすることではありません。一つのことをして、次のものに移る前にそれが完了したことを確認してから、リンス/リピートします。私はプロセスで私のアプリケーションをロックしないことを好むだろうが、この時点で私はそれが私が欲しいものをすることを意味する場合は気にしない。 – brian

    関連する問題