0

私はWPF((VB).NETで初めて)に挑戦し、MSAccessVBAで開始したプロジェクトを再作成しようとしています。基本的に、Webアプリケーション内の一連のページをスクレイプします。ご想像のとおり、LoadCompletedイベントで問題が発生しています。

私はそれに関するいくつかの情報を検索して見つけましたが、コードの「フロー」は、1ページがロードされるのを待つのに役立ちます。例えば:

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

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

同じサブでコードの実行を維持し、UIスレッドをロックせずに、ドキュメントが完全に読み込まれるのを確実に待つにはどうすればよいですか?

これが私がやろうとしていることの基本的な考え方です。

  1. ページに移動
  2. ページが完全に読み込まれるのを待ちます
  3. 何かをする
  4. ページに移動
  5. すすぎ、繰り返し

PS-.NETは私にとって非常に新しいので、私の脳にスタックオーバーフローを与えないでください;)

ありがとう、ブライアン

-## 編集 ##-

これは私が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とのやり取りは大きく異なります。

4

2 に答える 2

1

ハンドラーNavigateの最後でもう一度呼び出すだけです。LoadCompleted次に、ウィンドウ スコープの変数を使用して、ターゲット 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);
}

編集

たぶん、このようなものがより適しているでしょう。各サイクルの後、次の 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);
}
于 2012-05-01T14:14:07.727 に答える
0

多分私は道を外れているかもしれませんが、私はBackGroundWorker. プライマリ スレッドは、ページを検索するだけにします。"do stuff" が find よりも遅い場合は、find next を抑制します。

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

于 2012-05-02T00:33:18.780 に答える