2015-02-11 169 views
-1

在創建jpg圖像時,此代碼使用線程。但是,Thread.Join()有時會掛在創建特定圖像上。我研究過,似乎我應該使用BeginInvoke()來代替。我怎麼能重寫下面的代碼使用Thread.Join()BeginInvoke()新線程永不完成等待WebBrowser

public Bitmap Generate() 
{ 
    var m_thread = new Thread(_Generate); 
    m_thread.SetApartmentState(ApartmentState.STA); 
    m_thread.Start(); 
    m_thread.Join(); 

    return m_Bitmap; 
} 

private void _Generate() 
{ 
    var browser = new WebBrowser {ScrollBarsEnabled = false }; 
    browser.ScriptErrorsSuppressed = true; 
    browser.Navigate(m_Url); 
    browser.DocumentCompleted += WebBrowser_DocumentCompleted; 

    while (browser.ReadyState != WebBrowserReadyState.Complete) 
    { 
     Application.DoEvents(); 
    } 
    browser.Dispose(); 
} 
+2

[WebBrowser控件在新線程中可能的重複](http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread) – Blorgbeard 2015-02-11 03:25:21

回答

1

看着你的代碼,我看到一個問題。您已在Navigate()調用後註冊到DocumentCompleted事件。所以從理論上講,在註冊處理程序之前,事件可能已經被解僱。 嘗試交換兩行,看看你是否解決了你的問題。 我相信如果圖像已被檢索並被緩存,情況就會如此。

+0

謝謝。我感謝您的幫助。這並沒有解決問題。 – Sharma 2015-02-12 03:02:32

+0

所以你說這個問題可以針對特定圖像進行復制,對嗎?如果是這樣,那麼當您只爲這些圖像中的一個調用Generate時,問題會重新解決嗎? – Artak 2015-02-12 03:43:48

+0

我對這個問題進行了一些研究,似乎我有一些內存和緩存問題。我得到了現在成功工作的代碼。謝謝。 – Sharma 2015-02-27 12:29:48