다음 테스트 코드가 있습니다. 그것은 아무것도 유용하지 않습니다,하지만 나 VB 이해하는 것이이있다 :InvokeRequired는 true가 예상 될 때 false를 계속 반환합니다.
Imports System
Imports System.IO
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports System.Threading
Public Class Sandbox
Public Shared num As NumericUpDown
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objWrk As Worker
objWrk = New Worker
objWrk.Show()
End Sub
End Class
Public Class Worker
Public Sub Show()
Dim runThread As New System.Threading.Thread(AddressOf Run) ' Call the runner in a seperate thread
runThread.Start()
End Sub
Public Sub Run()
runToggle(1000)
End Sub
Public Delegate Sub runToggleInvoker(ByVal value As Integer)
Public Sub runToggle(ByVal value As Integer)
If Sandbox.Label1.InvokeRequired = True Then
Sandbox.Label1.Invoke(New runToggleInvoker(AddressOf runToggle), value)
Else
Sandbox.Label1.Text = value
End If
End Sub
End Class
양식은 Button
과 Label
로 구성되어 있습니다.
학습 목적으로 만 다른 스레드의 레이블에있는 텍스트를 변경하는 방법을 사용했습니다. 그러나 InvokeRequired
값은 False
을 계속 반환합니다. 이것이 어떻게 가능한지? Label1
은 주 스레드에서 만들어지고 runThread에서 조정되므로 InvokeRequired
에 True를 지정해야합니다.
Public Sub Run()
Sandbox.Show()
runToggle(1000)
End Sub
이 문제가 해결되지 않습니다
Here 나는 폼의 핸들이 아직 그렇게 만들어지지 않습니다 때 내 Run
방법을 변경 이런 것을 읽었다. 이 창 핸들을 가지고 컨트롤이나 폼을 찾을 때까지 컨트롤의 핸들이 아직 존재하지 않는 경우 Control.InvokeRequired Property
에 따르면
는
좋아,하지만 먼저 'Sandbox.Show()'를 코딩하는 핸들을 만들려고했습니다. 이 핸들을 만들어야합니다. –
이제 작업자 스레드 내부에서 Show를 호출하므로 호출이 필요하지 않습니다. 대신 주 스레드에서 양식을 표시하십시오. –