2012-10-16 4 views
0

html을 올바르게 표시하기 위해 webbrowser 컨트롤을 사용하는 데 문제가 있습니다. 내 목표는 webbrowser 컨트롤에 사용자 정의 html을 추가하고,이를 표시하고, 그 스크린 샷을 png로 저장하는 것입니다. 현재 Document.OpenNew 및 Document.Write (htmlText) 및 Application.DoEvents() 사용하고 있습니다. 그러나 배경 스레드에서 이것을 실행하고 있기 때문에 때로는 교착 상태가 발생합니다. 나는 범인이 문제를주고있는 Application.DoEvents()를 알고있다.webbrowser 컨트롤이 html을 "렌더링하지 않습니다"

그러나 내가 이것을 제거하고 html을 DocumentText 속성에 직접 설정하면 완전히 "렌더링"되거나로드되는시기를 어떻게 알 수 있습니까? DocumentCompleted 이벤트를 사용했지만 이벤트가 실행 된 후에도 저장된 이미지가 여전히 비어있어 작동하지 않는 것 같습니다.

또한 STA와 같은 스레드가 있습니다. 는 I가 노력하고 코드 여기

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

됩니다 : 여기

기존 코드 당신은 STA로 스레드를 생성해야

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

, 그건에서 웹 브라우저를 실행하는 유일한 방법입니다 배경 스레드입니다.

bw.SetApartmentState(ApartmentState.STA); 

대기에 대한 정보는 HtmlDocument.Write Method입니다. 아직 필요하지 않다면 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 
} 
+0

나는 이미 STA (내 질문에 편집 됨)라는 스레드가 있습니다. 제가 질문에서 말했듯이, DocumentCompleted는 저를 위해 일하지 않습니다. – user1750192

+0

내 대답이 – volody

+0

업데이트되었습니다. 효과가있었습니다. 동일한 이벤트에서 이벤트를 처리하는 대신 별도의 메소드에서 처리하는 것이 좋습니다 !!!! – user1750192

관련 문제