Heim >Backend-Entwicklung >C++ >Wie generiert man effizient dynamisches HTML mit dem WebBrowser von .NET und Async/Await?

Wie generiert man effizient dynamisches HTML mit dem WebBrowser von .NET und Async/Await?

Susan Sarandon
Susan SarandonOriginal
2025-01-15 06:47:12330Durchsuche

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

Verwenden Sie den WebBrowser von .NET oder mshtml.HTMLDocument, um HTML-Code dynamisch zu generieren

In diesem Artikel wird untersucht, wie Sie mithilfe der WebBrowser-Klasse von System.Windows.Forms oder der HTMLDocument-Schnittstelle der Microsoft HTML Object Library-Assembly dynamisch HTML-Code generieren.

Problemübersicht

Der Benutzer hat zunächst versucht, die Klasse System.Windows.Forms.WebBrowser zu verwenden, stieß jedoch beim Abrufen des gerenderten HTML-Codes auf Einschränkungen. Ich hatte das gleiche Problem beim Versuch, über die mshtml.HTMLDocument-Schnittstelle auf den Code zuzugreifen.

Benutzer schlossen diese Methoden aus und suchten nach Alternativen. Sie versuchten, die Eigenschaften des WebBrowsers zu nutzen, um die erforderlichen Daten zu erhalten, erkannten jedoch die Mängel dieses Ansatzes an.

Lösung

Die vorgeschlagene Lösung kombiniert die WebBrowser-Klasse und die Async/Await-Programmierung, um Änderungen im aktuellen HTML-Snapshot der Seite effizient abzufragen und gleichzeitig die WebBrowser.IsBusy-Eigenschaft zu überprüfen. Zu den wichtigsten Überlegungen gehören:

  • Verwenden Sie eine erweiterte Abfragelogik, um kontinuierlich zu überprüfen, ob sich der gerenderte HTML-Code geändert hat.
  • Implementieren Sie eine Timeout-Logik, wenn der Seitenrenderingprozess unbegrenzt wird.
  • Nutzen Sie die Vorteile von async/await, um die asynchrone Abfragelogik zu vereinfachen.
  • Integrieren Sie Browser-Funktionssteuerelemente, um HTML5-Rendering zu ermöglichen.

Code-Implementierung

Der folgende Code demonstriert die LoadDynamicPage-Methode der gekapselten Lösung:

<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>

Browser-Funktionssteuerung

Um die HTML5-Wiedergabe in Internet Explorer 10 und höher zu aktivieren, verwenden Sie die unten gezeigten Browser-Funktionssteuerelemente:

<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>

Das obige ist der detaillierte Inhalt vonWie generiert man effizient dynamisches HTML mit dem WebBrowser von .NET und Async/Await?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn