Visual Basic .NET Language
스레딩
수색…
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