2012-06-10 3 views
0

음, 내가 처음 묻는 사람은 아니지만 VB.NET에서 스레드를 사용하는 가장 쉬운 방법은 무엇입니까? 원격 서버에서 문자열을 다운로드 한 다음 GUI에 해당 문자열을 표시해야하므로 일부 콜백 함수를 사용하여 주 스레드에서 호출해야합니다. 나는 이것에 대한 다른 접근 방법을 찾았지만 모두 (GTK와) 나는 같은 것을 사용 파이썬에 비해 매우 어려운 것 같다 VB.NET의 스레드

gobject.idle_add(callback_function, parameters) 

와 "callback_function"

는 메인 스레드에서 실행되었다. 어떻게 VB.NET에서 그렇게합니까?

답변

3

다음은 간단한 예입니다. 다른 언어보다 조금 어려울 수도 있지만 여전히 복잡하지는 않습니다.

Private Sub beginDoWork() 
    Dim thread As New Thread(AddressOf DoWork) 
    thread.Start() 
End Sub 

Public Sub DoWork() 
    Dim result As String = getStringFromRemoteServer() 
    workCompleted(result) 
End Sub 

Private Delegate Sub workCompletedDelegate(result As String) 
Private Sub workCompleted(result As String) 
     If InvokeRequired Then 
      Invoke(New workCompletedDelegate(AddressOf workCompleted(result) 
      Exit Sub 
     End If 
     Label1.Text = result 
End Sub 

이 더 단지 DoWork을함으로써 간단하게 할 수 항상 Invoke 전화 : 다음 코드는 (그렇지 않으면, 당신은 Invoke 전화를 몇 가지 제어 또는 양식 참조를 사용해야 할 것) 양식 클래스 내에 있다고 가정 workCompleted을 호출하는 대신에 workCompleted을 호출해야하는지 확인합니다. 그러나 작성한 방법은 작업자 스레드 대신 UI 스레드에서 작업을 수행하려는 경우 좀 더 캡슐화되고 효율적입니다.

+0

"그렇지 않다면 Invoke를 호출하기 위해 컨트롤이나 폼 참조를 사용해야 할 것입니다."- 설명해 주시겠습니까? – ov1d1u

+0

Invoke 및 InvokeRequired는 Control 클래스의 멤버입니다. Form은 Control을 상속받습니다. 따라서이 메서드도 있습니다. UI 스레드에서 workCompleted 메서드를 다시 호출하는 메서드가 필요합니다. 따라서 코드가 폼 자체에 있으면 Invoke (또는 Me.Invoke)를 호출 할 수 있지만 코드가 컨트롤을 상속받지 않는 별도의 클래스에 있으면 폼이나 컨트롤에 대한 참조가 필요합니다 Invoke (예 : formOnWhichToShowResults.Invoke)를 호출 할 때 사용할 수 있습니다. –

+0

Gracias. 나는이 VB.Net에서 정말 새롭고, 새로운 것들이 아닐지라도 어떤 점은 이해하기가 더 어렵습니다. – ov1d1u