2011-09-22 55 views
0

我有一個Windows窗體應用程序,不幸的是,它必須調用第二個線程的控件。我一直在使用http://msdn.microsoft.com/en-us/library/ms171728.aspx上描述的線程安全模式。這在過去很有效。VB.NET 2.0 - 使用線程安全調用Windows窗體控件時出現的StackOverflowException

我現在有具體的問題:我有一個WebBrowser控件,我試圖調用WebBrowser.Navigate()方法使用此線程安全模式,結果我得到StackOverflow異常。這是我寫的線程安全導航方法。

Private Delegate Sub NavigateControlCallback(ByRef wb As WebBrowser, ByVal url As String) 

Private Sub AsyncNavigate(ByRef wb As WebBrowser, ByVal URL As String) 
    Try 
     If wb.InvokeRequired Then 
      Dim callback As New NavigateControlCallback(AddressOf AsyncNavigate) 
      callback(wb, url) 
     Else 
      wb.Navigate(url) 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

是否存在線程安全的方式來與WinForms組件交互,而沒有這些StackOverflowExceptions的副作用?

回答

2

這就是問題所在:

If wb.InvokeRequired Then 
    Dim callback As New NavigateControlCallback(AddressOf AsyncNavigate) 
    callback(wb, url) 
Else 

在If塊的第二行,你只需再次調用AsyncNavigate。直。 Resursively。沒有編組到UI線程。您應該使用InvokeBeginInvoke

If wb.InvokeRequired Then 
    Dim callback As New NavigateControlCallback(AddressOf AsyncNavigate) 
    wb.BeginInvoke(callback(wb, url)) 
Else 

(邊注:請不要嚥下這樣的例外......)

+0

嗯,這確實停止了StackOverflow的例外,但現在的導航從未實際發生。我會去做更多的研究。萬分感謝。 – LamdaComplex

+0

@LamdaComplex:你有沒有嘗試在'wb.Navigate'調用本身上放置一個斷點,看看是否被調用?如果你希望後臺線程等待回調發生,當然你應該使用'Invoke'而不是'BeginInvoke'。 –

+0

@LamdaComplex'但現在導航永遠不會發生,這是例外,你只是忽略它們。 –

相關問題