ホームページ > バックエンド開発 > C++ > .NET の WebBrowser と Async/Await を使用して動的 HTML を効率的に生成するにはどうすればよいですか?

.NET の WebBrowser と Async/Await を使用して動的 HTML を効率的に生成するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-15 06:47:12
オリジナル
324 人が閲覧しました

How to Efficiently Generate Dynamic HTML Using .NET's WebBrowser and Async/Await?

.NET の WebBrowser または mshtml.HTMLDocument を使用して HTML コードを動的に生成します

この記事では、System.Windows.Forms の WebBrowser クラス、または Microsoft HTML Object Library アセンブリの HTMLDocument インターフェイスを使用して、HTML コードを動的に生成する方法について説明します。

問題の概要

ユーザーは最初に System.Windows.Forms.WebBrowser クラスを使用しようとしましたが、レンダリングされた HTML コードを取得する際に制限が発生しました。 mshtml.HTMLDocument インターフェイスを介してコードにアクセスしようとすると、同じ問題が発生しました。

ユーザーはこれらの方法を除外し、代替手段を探し、Web ブラウザのプロパティを使用して必要なデータを取得する方法を模索しましたが、このアプローチの欠点も認識していました。

解決策

提案されたソリューションは、WebBrowser クラスと非同期/待機プログラミングを組み合わせて、WebBrowser.IsBusy プロパティをチェックしながら、ページの現在の HTML スナップショットの変更を効率的にポーリングします。主な考慮事項は次のとおりです:

  • 高度なポーリング ロジックを使用して、レンダリングされた HTML が変更されたかどうかを継続的にチェックします。
  • ページのレンダリングプロセスが無期限になった場合のタイムアウトロジックを実装します。
  • async/await の利点を利用して、非同期ポーリング ロジックを簡素化します。
  • ブラウザ機能コントロールを統合して、HTML5 レンダリングを有効にします。

コードの実装

次のコードは、カプセル化されたソリューションの LoadDynamicPage メソッドを示しています。

<code class="language-csharp">async Task<string> LoadDynamicPage(string url, CancellationToken token)
{
    // 导航和DocumentCompleted事件处理
    var tcs = new TaskCompletionSource<bool>();
    WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true);

    using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
    {
        this.webBrowser.DocumentCompleted += handler;
        try
        {
            this.webBrowser.Navigate(url);
            await tcs.Task; // 等待DocumentCompleted
        }
        finally
        {
            this.webBrowser.DocumentCompleted -= handler;
        }
    }

    // 获取根元素
    var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

    // 异步轮询当前HTML更改
    var html = documentElement.OuterHtml;
    while (true)
    {
        // 异步等待
        await Task.Delay(500, token); 

        // 如果WebBrowser繁忙,则继续轮询
        if (this.webBrowser.IsBusy)
            continue;

        var htmlNow = documentElement.OuterHtml;
        if (html == htmlNow)
            break; // 未检测到更改,结束轮询循环

        html = htmlNow;
    }

    // 认为页面已完全渲染
    token.ThrowIfCancellationRequested();
    return html;
}</code>
ログイン後にコピー
ブラウザ機能の制御

Internet Explorer 10 以降で HTML5 レンダリングを有効にするには、以下に示すブラウザー機能コントロールを使用します。

以上が.NET の WebBrowser と Async/Await を使用して動的 HTML を効率的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート