VB.net을 작성할 때 스레드의 Form에 있는 ListView 컨트롤의 정보를 변경해야 하는 필요성을 느꼈습니다. 이 작업을 시작했을 때 쉽지 않다는 것을 알았습니다. Microsoft의 프레임워크는 스레드의 양식 컨트롤에 대한 직접 액세스를 권장하지 않기 때문입니다. 이는 UI 프로세스의 정상적인 실행을 변경하기 때문입니다. 이 작업을 수행해야 하는 경우 스레드에서 Invoke 함수 또는 InvokeBegin 함수를 사용해야 합니다. 예는 다음과 같습니다.
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
Dimmythread As Thread
mythread = New Thread(New ThreadStart(AddressOf ThreadFunction) )
mythread.Start()
End Sub
Private Sub ThreadFunction()
Dimmythread As Thread
mythread = New Thread(New ThreadStart(AddressOf DoScanThread))
mythread.Start()
End Sub 'ThreadFunction
Private Sub DoScanThread()
Dim myThreadClassObject As New ScanThreadClass(Me)
myThreadClassObject.run()
End Sub
공개 하위 AddListItemMethod(ByVal IPString As String, ByVal scanport As Integer)
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)
myFormControl1 = myForm
End Sub 'New
Public Sub run()
myFormControl1. Invoke(myFormControl1.myDelegate, New Object() {"11", 123})
End Sub
End Class
주목해야 할 주요 사항은 Invoke 호출과 대리인의 정의.