この記事では、System.Windows.Forms の WebBrowser クラス、または Microsoft HTML Object Library アセンブリの HTMLDocument インターフェイスを使用して、HTML コードを動的に生成する方法について説明します。
ユーザーは最初に System.Windows.Forms.WebBrowser クラスを使用しようとしましたが、レンダリングされた HTML コードを取得する際に制限が発生しました。 mshtml.HTMLDocument インターフェイスを介してコードにアクセスしようとすると、同じ問題が発生しました。
ユーザーはこれらの方法を除外し、代替手段を探し、Web ブラウザのプロパティを使用して必要なデータを取得する方法を模索しましたが、このアプローチの欠点も認識していました。
提案されたソリューションは、WebBrowser クラスと非同期/待機プログラミングを組み合わせて、WebBrowser.IsBusy プロパティをチェックしながら、ページの現在の HTML スナップショットの変更を効率的にポーリングします。主な考慮事項は次のとおりです:
次のコードは、カプセル化されたソリューションの 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>
以上が.NET の WebBrowser と Async/Await を使用して動的 HTML を効率的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。