Webブラウザコントロールを使用してHTMLを正しく表示するのに問題があります。私の目標は、カスタムhtmlをwebbrowserコントロールに追加して表示し、そのスクリーンショットをpngとして保存することです。現在、Document.OpenNewとDocument.Write(htmlText)およびApplication.DoEvents()を使用しています。ただし、これをバックグラウンドスレッドで実行しているため、デッドロックが発生することがあります。犯人はApplication.DoEvents()で、問題が発生していることはわかっています。
ただし、それを削除してhtmlをDocumentTextプロパティに直接設定すると、完全に「レンダリング」またはロードされたことをどのように知ることができますか。DocumentCompletedイベントを使用しましたが、イベントが発生した後も保存されている画像が空のままであるため、機能しないようです。
私もSTAとしてスレッドを持っています。
既存のコードは次のとおりです。
Thread th = new Thread(new ThreadStart(createImage));
th.SetApartmentState(ApartmentState.STA);
th.Start();
th.Join(TIMEOUT);
private void createImage() {
var browser = new WebBrowser();
var doc = browser.Document;
doc.OpenNew(false);
doc.Write("<html><body>....</body><html>)");
//loop for few seconds
for(int i=0; i<20; i++)
{
Application.DoEvents();
Thread.Sleep(100);
}
//save to file as png.
}
これが私が試しているコードです:
private void createImage() {
var browser = new WebBrowser();
bool docComplete = false;
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(
(Object sender, WebBrowserDocumentCompletedEventArgs args) =>
{ docComplete = true; }
);
browser.DocumentText = "<html>.....";
while (!_docComplete)
{
Thread.Sleep(100);
}
// save image
// :-( not working
}