VB.net を書いていたときに、スレッド内の Form 上の ListView コントロールの情報を変更する必要があることがわかりました。 Microsoft のフレームワークでは、スレッド内のフォーム上のコントロールへの直接アクセスが推奨されていないためです。これにより、UI プロセスの通常の実行が変更されるためです。これを行う必要がある場合は、スレッド内で Invoke 関数または InvokeBegin 関数を使用する必要があります。以下に例を示します。
Imports System.Threading
Public Class Form1
Delegate Sub AddListItem(ByVal IPString As String, ByVal ScanPort As Integer)
Public myDelegate As AddListItem
Public OpenPortCount As Integer = 0
Private Sub Form1_Load(ByVal) sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myDelegate = New AddListItem(AddressOf AddListItemMethod)
End Sub
Private Sub Start_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ハンドルStart_Button.Click
mythread を Thread として暗くする
mythread = New Thread(New ThreadStart(ThreadFunction))
mythread.Start()
End Sub
Private Sub ThreadFunction()
mythread を Thread として暗くする
mythread = New Thread(New ThreadStart (doscanthread のアドレス)
Mythread.start ()
End sub -privFunction
Private Sub Doscanthread () Lass (Me) yMythreadClassObject.run ()
End Sub
ListView_Result.Items.Add(IPString, OpenPortCount) 'ScanIP.ToString(), 0)
ListView_Result.Items(OpenPortCount).SubItems.Add(scanport.ToString())
OpenPortCount + = 1
End Sub 'AddListItemMethod
End Class
Public Class ScanThreadClass
Private myFormControl1 As Form1
Public Sub New(ByVal myForm As Form1)
End Sub 'New
myFormControl1.Invoke(myForm Control1.myDelegate , New Object() {"11", 123})
End Sub
End Class
注目すべき点はInvokeの呼び出しとDelegateの定義です。