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
}
나는 이미 STA (내 질문에 편집 됨)라는 스레드가 있습니다. 제가 질문에서 말했듯이, DocumentCompleted는 저를 위해 일하지 않습니다. – user1750192
내 대답이 – volody
업데이트되었습니다. 효과가있었습니다. 동일한 이벤트에서 이벤트를 처리하는 대신 별도의 메소드에서 처리하는 것이 좋습니다 !!!! – user1750192