2012-10-16 43 views
0

我遇到了使用webbrowser控件正确显示html的问题。我的目标是将自定义html添加到webbrowser控件,并显示它,并将其截图保存为png。目前我正在使用Document.OpenNew和Document.Write(htmlText)和Application.DoEvents()。然而,因为我在后台线程中运行它,有时它会死锁。我知道罪魁祸首是Application.DoEvents()给我带来麻烦。webbrowser控件不“渲染”html

但是,如果我删除并直接将html设置为DocumentText属性,我怎么知道它何时完全“呈现”或加载。我使用了DocumentCompleted Event,但这似乎不起作用,因为即使在事件触发后,保存的图像仍为空。

我也有线程作为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 
} 

回答

0

你必须创建一个线程STA,即只在运行web浏览器的方式后台线程。

bw.SetApartmentState(ApartmentState.STA); 

没有关于在HtmlDocument.Write Method等待的信息。如果还需要,那么你可以添加DocumentCompleted处理程序而不是DoEvents

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 
} 
+0

我已经有线程作为STA(编辑我的问题)。就像我在问题中所说的那样,DocumentCompleted不适合我。 – user1750192

+0

已更新我的回答 – volody

+0

太棒了!那工作。而不是在同一个事件中处理事件,而是使用单独的方法做到这一点! – user1750192