- - PR -
別スレッドでURLに接続するには
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-12-21 19:48
複数のURLに同時に接続したいのですが、
フォーム上に複数のWebBrowserコントロールを配置して接続すると、 Navigateメソッドは非同期でもかなり重く操作性が悪くなりました。 そこで、別スレッドから接続してHTMLDocumentの生成は済ませておき、必要なときにフォームに表示しようと思いました。 WebBrowserのDocumentプロパティが設定できればよかったのですが、 読み取り専用なのでDocumentStreamを設定することにしました。 次の3つのクラスを追加します。 Public Class Browser Inherits WebBrowser Public Sub Wait() 'ページの読み込みを待つ With Me While .IsBusy Or .ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() End While End With End Sub End Class Imports System.Threading Public Class BrowserThread Private _browser As Browser Private _url As String Private _thread As New Thread(New ThreadStart(AddressOf Run)) Private _form1 As Form1 Public Sub New(ByVal form1 As Form1, ByVal url As String) Me._form1 = form1 Me._url = url _thread.SetApartmentState(ApartmentState.STA) _browser = New Browser End Sub Public Sub Run() _browser.Navigate(_url) _browser.Wait() Debug.Print("接続完了") _form1.SetDocumentStream(_browser.DocumentStream) End Sub Public Sub Start() _thread.Start() End Sub End Class ’WebBrowserコントロールを追加 Public Class Form1 Private WithEvents _browserThread As BrowserThread Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load _browserThread = New BrowserThread(Me, "http://www.yahoo.co.jp/") _browserThread.Start() End Sub Public Delegate Sub SetDocumentStreamDelegate(ByVal stream As System.IO.Stream) Private _setDocumentDelegate As New SetDocumentStreamDelegate(AddressOf SetDocumentStream) Friend Sub SetDocumentStream(ByVal stream As System.IO.Stream) If Me.InvokeRequired Then Me.Invoke(_setDocumentDelegate, stream) Return End If Me.WebBrowser1.DocumentStream = stream End Sub End Class できた!と思ったのですが、URLをヤフーではなく次のCodeZineにしたらスクリプトエラーが発生します。 http://codezine.jp/Default.aspx WebBrowserのScriptErrorsSuppressed を Trueにすればいいと思ったら、 意味不明の箇所でInvalidCastExceptionが投げられます。 これを解決する方法はありますか? よろしくお願いします。 [ メッセージ編集済み 編集者: hei 編集日時 2006-12-21 21:23 ] |
1