首页 >后端开发 >C++ >如何使用.NET的WebBrowser和Async/Await高效生成动态HTML?

如何使用.NET的WebBrowser和Async/Await高效生成动态HTML?

Susan Sarandon
Susan Sarandon原创
2025-01-15 06:47:12330浏览

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