수색…


Control.Invoke ()를 사용하여 스레드로부터 안전한 호출 수행

Control.Invoke() 메서드를 사용하면 메서드 또는 함수의 실행을 백그라운드 스레드에서 컨트롤이 만들어진 스레드 (일반적으로 UI (사용자 인터페이스) 스레드)로 이동할 수 있습니다. 이렇게하면 코드가 컨트롤의 스레드에서 실행되도록 큐에 대기하게되어 병행 성을 제거 할 수 있습니다.

Control.InvokeRequired 속성을 호출하여 호출해야하는지 또는 코드가 이미 컨트롤과 동일한 스레드에서 실행 중인지 여부를 확인해야합니다.

Invoke() 메서드는 첫 번째 매개 변수로 대리자를 사용합니다. 대리자는 참조, 매개 변수 목록 및 반환 형식을 다른 메서드에 보관합니다.

Visual Basic 2010 (10.0) 이상에서는 람다 식 을 사용하여 즉시 대리인 메서드를 만들 수 있습니다.

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
    LogTextBox.AppendText("Check passed")
End If

Visual Basic 2008 (9.0) 이하에서는 위임자를 직접 선언해야합니다.

Delegate Sub AddLogText(ByVal Text As String)

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(New AddLogText(AddressOf UpdateLog), "Check passed")
Else
    UpdateLog("Check passed")
End If

Sub UpdateLog(ByVal Text As String)
    LogTextBox.AppendText(Text)
End Sub

Async / Await을 사용하여 스레드 안전 호출 수행

UI 스레드의 객체를 다른 스레드에서 변경하려고하면 크로스 스레드 연산 예외가 발생합니다.

Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' Cross thread-operation exception as the assignment is executed on a different thread
    ' from the UI one:
    Task.Run(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub

VB 14.0.NET 4.5 이전 에 솔루션은 UI 스레드에서 할당 및 객체를 호출했습니다.

Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' This will run the conde on the UI thread:
    MyButton.Invoke(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub

VB 14.0을 사용하면 다른 스레드에서 Task 을 실행 한 다음 실행이 완료되면 컨텍스트를 복원 한 다음 Async / Await를 사용하여 할당을 수행 할 수 있습니다.

Private Async Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' This will run the code on a different thread then the context is restored
    ' so the assignment happens on the UI thread:
    MyButton.Text = Await Task.Run(Function() Thread.CurrentThread.ManagedThreadId)
End Sub


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow