首頁 >後端開發 >C++ >如何使用.NET的WebBrowser和Async/Await高效產生動態HTML?

如何使用.NET的WebBrowser和Async/Await高效產生動態HTML?

Susan Sarandon
Susan Sarandon原創
2025-01-15 06:47:12328瀏覽

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

利用.NET的WebBrowser或mshtml.HTMLDocument動態產生HTML程式碼

本文探討如何使用System.Windows.Forms的WebBrowser類別或Microsoft HTML物件庫組件的HTMLDocument介面動態產生HTML程式碼。

問題概述

使用者最初嘗試使用System.Windows.Forms.WebBrowser類,但在取得渲染後的HTML程式碼時遇到限制。嘗試透過mshtml.HTMLDocument介面存取程式碼也遇到了相同的問題。

使用者排除了這些方法,並尋求替代方案,探索使用WebBrowser的屬性來獲取所需數據,但承認這種方法的不足。

解決方案

提出的解決方案結合了WebBrowser類別和async/await編程,以高效地輪詢頁面當前HTML快照中的更改,同時檢查WebBrowser.IsBusy屬性。關鍵考慮因素包括:

  • 使用進階輪詢邏輯持續檢查渲染後的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渲染,請使用如下所示的瀏覽器功能控制:

<code class="language-csharp">private static void SetFeatureBrowserEmulation()
{
    if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
        return;
    var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
    Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
        appName, 10000, RegistryValueKind.DWord);
}</code>

以上是如何使用.NET的WebBrowser和Async/Await高效產生動態HTML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn