- PR -

別スレッドでURLに接続するには

1
投稿者投稿内容
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)