2011-09-22 6 views
0

残念ながら、2番目のスレッドからコントロールを呼び出す必要がある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 

これらのStackOverflowExceptionsの副作用なしにWinFormsコンポーネントとやり取りするスレッドセーフな方法はありますか?

答えて

2

これが問題である:Ifブロックの2行目に

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

、あなたはだけ再びAsyncNavigateを呼んでいます。直接。 Resursively。 UIスレッドをマーシャリングしないでください。あなたはInvokeBeginInvokeを使用する必要があります。

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

(余談:そのような例外を飲み込むしないでください...)確かにStackOverflowの例外を停止したが、今のナビゲートが実際に発生したことがない

+0

まあを。私はこれについてさらに研究をするつもりです。ありがとう、トン。 – LamdaComplex

+0

@ LamdaComplex: 'wb.Navigate'呼び出し自体にブレークポイントを設定しようとしましたか?コールバックが起こるまでバックグラウンドスレッドを待たせたいなら、 'BeginInvoke'の代わりに' Invoke'を使うべきです。 –

+0

@LamdaComplex 'しかし、現在ナビゲートは決して実際には起こりません。これは例外であり、あなたはただ無視しているだけです。 –

関連する問題