0

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

1 に答える 1

0

STAとしてスレッドを作成する必要があります。これは、バックグラウンドスレッドでWebBrowserを実行する唯一の方法です。

bw.SetApartmentState(ApartmentState.STA);

HtmlDocument.Writeメソッドでの待機に関する情報はありません。まだ必要な場合は、DoEventsの代わりにDocumentCompletedハンドラーを追加できます

private void captureImageThread(string html) { 
   var thread = new Thread(() => { 
       var browser = new WebBrowser(); 
       browser.DocumentCompleted += browser_DocumentCompleted; 
       browser.DocumentText = html;
       Application.Run(); 
   }); 
   thread.SetApartmentState(ApartmentState.STA); 
   thread.Start(); 
} 

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
   var br = sender as WebBrowser; 
   // save image here
   Application.ExitThread();   // Stops the thread 
} 
于 2012-10-16T15:13:42.417 に答える