Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menjana HTML Dinamik dengan Cekap Menggunakan Pelayar Web .NET dan Async/Await?

Bagaimana untuk Menjana HTML Dinamik dengan Cekap Menggunakan Pelayar Web .NET dan Async/Await?

Susan Sarandon
Lepaskan: 2025-01-15 06:47:12
asal
327 orang telah melayarinya

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

Gunakan WebBrowser atau mshtml.HTMLDocument .NET untuk menjana kod HTML secara dinamik

Artikel ini meneroka cara menjana kod HTML secara dinamik menggunakan kelas WebBrowser System.Windows.Forms atau antara muka HTMLDocument bagi perhimpunan Microsoft HTML Object Library.

Gambaran Keseluruhan Masalah

Pengguna pada mulanya cuba menggunakan kelas System.Windows.Forms.WebBrowser tetapi menghadapi had dalam mendapatkan kod HTML yang diberikan. Saya mempunyai masalah yang sama cuba mengakses kod melalui antara muka mshtml.HTMLDocument.

Pengguna menolak kaedah ini dan mencari alternatif, meneroka menggunakan sifat WebBrowser untuk mendapatkan data yang diperlukan, tetapi mengakui kelemahan pendekatan ini.

Penyelesaian

Penyelesaian yang dicadangkan menggabungkan kelas WebBrowser dan pengaturcaraan async/menunggu untuk meninjau secara cekap perubahan dalam petikan HTML semasa halaman sambil menyemak sifat WebBrowser.IsBusy. Pertimbangan utama termasuk:

  • Gunakan logik pengundian lanjutan untuk terus menyemak sama ada HTML yang diberikan telah berubah.
  • Laksanakan logik tamat masa jika proses pemaparan halaman menjadi tidak tentu.
  • Gunakan kelebihan tak segerak/menunggu untuk memudahkan logik undian tak segerak.
  • Sepadukan kawalan ciri penyemak imbas untuk mendayakan pemaparan HTML5.

Pelaksanaan kod

Kod berikut menunjukkan kaedah LoadDynamicPage bagi penyelesaian terkapsul:

<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>
Salin selepas log masuk

Kawalan fungsi penyemak imbas

Untuk mendayakan pemaparan HTML5 dalam Internet Explorer 10 dan ke atas, gunakan kawalan ciri penyemak imbas yang ditunjukkan di bawah:

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menjana HTML Dinamik dengan Cekap Menggunakan Pelayar Web .NET dan Async/Await?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan