4

Webブラウザーがページの読み込みを完了するのを待ち、その後何かをしたい; ただし、ブラウザページで読み取った値に応じてブール値を返すため、メインメソッドを離れたくありません。

これが私が試したものですが、明らかにメインメソッドを残しています

    public async Task<bool> Commit()
    {
        try
        {
            Browser = new WebBrowser { ScriptErrorsSuppressed = true };

            Browser.Navigate(Server);
            Browser.DocumentCompleted += DocumentCompleteMethod;

//HERE I WANNA RETURN TRUE,FALSE DEPENDING ON THE VALUE I WILL READ FROM THE WEB PAGE
        }
        catch (Exception ex)
        {
            return false;
        }
        return true;
    }

private void DocumentCompleteMethod(object sender, WebBrowserDocumentCompletedEventArgs e)
{

}
4

3 に答える 3

2

コードをこれに変更できます。

  public async Task<bool> Commit()
        {
            try
            {
                var Browser = new WebBrowser { ScriptErrorsSuppressed = true };

                Browser.Navigate(Server);
                Browser.DocumentCompleted += DocumentCompleteMethod;

               while (Browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }

   //At this point you can access the document as it is sure to be loaded.
   string title = Browser.Document.Title;

    //HERE I WANNA RETURN TRUE,FALSE DEPENDING ON THE VALUE I WILL READ FROM THE WEB PAGE
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

    private void DocumentCompleteMethod(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }
于 2013-02-13T23:08:10.953 に答える
2

これは、非同期プログラミングの一般的な問題です。通常の同期プロセスが思い通りに機能しません。

非同期の方法論を使用してプロセスを再構築することを検討してください。値を返さず、プロセスを開始し、実行するアクションをプロセスに処理させます。たとえばDocumentCompleteMethod、ページの結果に応じてアクションを実行させます。

非同期プロセスを強制的に同期メソッドに準拠させる必要がある場合は、 のようなスレッド シンクロナイザーの使用を検討してAutoResetEventください。Jon Skeet は、スレッドでの WebBrowser.Navigate メソッドの実行に関する StackOverflow の質問への素晴らしい回答を投稿しました。

于 2013-02-13T23:05:19.897 に答える