Public Class Form1 #Region "フィールド" ' マルチスレッド用に使うdelegate Private Delegate Sub multi() Private thread As multi ' クロススレッド対策に使うdelegate Private Delegate Sub crossThreadEvasion() ' Hogeクラスを呼び出すインスタンス Private objHoge As Hoge #End Region Public Sub New() InitializeComponent() objHoge = New Hoge() End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Me.Label1.Text = String.Empty Me.Button2.Enabled = False End Sub ' 処理を開始 Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Me.Button1.Enabled = False Me.Button2.Enabled = True thread = New multi(AddressOf BackGroundConnect) ' 別スレッドで処理を開始し、BackGroundConnectの処理が終了したらEndShowが呼ばれます。 ' nullはEndShow(ByVal ar As IAsyncResult)メソッドの引数。 ' 平たく言うと、非同期処理で同期を取りたい時に利用します。 thread.BeginInvoke(New AsyncCallback(AddressOf EndShow), Nothing) End Sub ''' <summary> ''' HogeShowを呼び出す。 ''' このメソッドは、別スレッドから処理されます。 ''' </summary> Private Sub BackGroundConnect() objHoge.HogeShow() End Sub ' 処理を終了 Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click objHoge.IsEndLoop = True End Sub #Region "終了処理" ''' <summary> ''' 終了処理 ''' </summary> Private Sub EndShow() Me.Label1.Text = "処理を終了します。" Me.Button1.Enabled = True Me.Button2.Enabled = False objHoge.IsEndLoop = False End Sub ''' <summary> ''' クロススレッド対策用。 ''' endShowメソッドをデリゲート経由でアクセスする。 ''' </summary> Private Sub EndShowInvoke() Me.EndShow() End Sub ''' <summary> ''' 終了処理のマーシャリング ''' </summary> ''' <param name="ar">平たく言うと、非同期処理で同期を取りたい時に利用</param> Private Sub EndShow(ByVal ar As IAsyncResult) ' Invokeの処理が必要か? If Me.Label1.InvokeRequired Then Dim d As New crossThreadEvasion(AddressOf EndShowInvoke) Me.Invoke(d) Else Me.EndShow() End If End Sub #End Region End Class