2009-07-17 3 views
1

단추를 클릭하면 별도의 그리드를 시작하고 웹 브라우저 컨트롤을 사용하여 뭔가를 수행합니다. 그러나 버튼이 클릭되면 새 스레드가 분리되지 않는 것처럼 보입니다. 새 스레드가 완료 될 때까지 UI가 멈추는 원인이됩니다. 여기새 스레드가 여전히 UI 스레드를 차단하고 있습니다

코드 : 내가 잘못

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click 
    FindCustomerLocation() 
    e.Handled = True 
End Sub 


Private Sub FindCustomerLocation() 
    Dim Findcontractor_Thread As New Thread(AddressOf FindContractor_ThreadExecute) 
    Findcontractor_Thread.Priority = ThreadPriority.AboveNormal 
    Findcontractor_Thread.Start() 
End Sub 


Delegate Sub FindContractorDelegate(ByVal igGrid As Infragistics.Windows.DataPresenter.XamDataGrid, ByVal webbrowser As Controls.WebBrowser) 


Private Sub FindContractor_ThreadExecute() 
    Dim threadControls(1) As Object 
    threadControls(0) = Me.XamDataGrid1 
    threadControls(1) = Me.WebBrowserMap 

    Dim m As FindContractorDelegate = AddressOf FindContractor_WorkingThread 
    Me.Dispatcher.BeginInvoke(m, threadControls) 
End Sub 


Private Sub FindContractor_WorkingThread() 

    Mouse.OverrideCursor = Cursors.Wait 

'Do something... 

    Mouse.OverrideCursor = Nothing 
End Sub 

을하고있어 무엇?

덕분에, Neils

답변

4

당신은 " '뭔가를 할"의 윈폼 컨트롤 작업 propabldy. 컨트롤은 UI 스레드에서만 유지 될 수 있습니다.

그래서 "BeginInvoke"는 UI 스레드에서 대상을 호출합니다. 그래서 당신은 te paralel 쓰레드를 만들지 만, 전체적으로 UI 쓰레드에서 다시 생각하고 있습니다.

+0

같은 추가 매개 변수를 추가 나는 윈폼과 협력 시스템이 당신이 말하는 것을보고 예외가 발생했다. – Zac

-2

새 스레드는 더 높은 우선 순위를 가지고 있으므로 (이 부분적으로 집중적 인만큼)이 문제를 해결하기 위해 UI가이하는대로 동결

2

사용 Dispatcher.CurrentDispatcher.BeginInvoke의 원인이됩니다.

Dispatcher 인스턴스가 GUI 스레드를 호출하지만 Dispatcher.CurrentDispatcher이 존재하지 않으면 현재 실행중인 스레드에 대해 새 Dispatcher 인스턴스를 생성하므로 문제가 발생합니다.

이것은 Windows가 자신이 winform을 만드는 새로운 스레드에 대한 메시지 큐를 만드는 방법과 개념이 비슷합니다. 먼저 스레드를 시작하고 당신이 때 스레드

1
Dim Findcontractor_Thread As New Thread(AddressOf FindContractor_ThreadExecute) 
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal 
Findcontractor_Thread.Start() 

은 명심

trd_copy.Start() 

Delegate Sub nameofDelegate() 
Sub nameofDelegate+NameofSub() 
If Form1.ProgressBar1.InvokeRequired Then 
    Dim d As New nameofDelegate (AddressOf nameofDelegate+NameofSub) 
    NameOfYourForm.Invoke(d, New Object()) 
Else 
    NameOfYourForm.ProgressBar1.Refresh() ** Or other Gui Functions 
End If 
End Sub 

parametrs없이 매개 변수 스레드 호출의

trd_copy.ParameterizedStart(src) 

Delegate Sub nameofDelegate(s As Integer) 
Sub nameofDelegate+NameofSub(ByVal s As Integer) 
If Form1.ProgressBar1.InvokeRequired Then 
    Dim d As New nameofDelegate (AddressOf nameofDelegate+NameofSub) 
    NameOfYourForm.Invoke(d, New Object() {s}) 
Else 
    If s = 1 Then 
     NameOfYourForm.ProgressBar1.Refresh() ** Or other Gui Functions 
    Else 

    End If 
End If 

최종 하위

통화를 VB에서 초기 스레드로 (me) 전달해야합니다 모델 코딩 "Default Form Instances"개념을 가지고 있습니다. 응용 프로그램의 네임 스페이스에있는 모든 양식의 경우 Forms 속성 아래에있는 My 네임 스페이스에 기본 인스턴스가 만들어집니다.

하고 그냥 내 별도의 스레드에서 너무

Private Sub FindCustomerLocation() 
Dim Findcontractor_Thread As New Thread(AddressOf FindContractor_ThreadExecute) 
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal 
Findcontractor_Thread.Start(me) 
End Sub 



Private Sub FindContractor_ThreadExecute(beginform as *NameOfFormComingFrom*) 
Dim threadControls(1) As Object 
threadControls(0) = Me.XamDataGrid1 
threadControls(1) = Me.WebBrowserMap 


FindContractor_WorkingThread(threadControls,beginform) 
End Sub 


Delegate Sub FindContractor_WorkingThread(s As Integer,beginform as *NameOfFormComingFrom*) 
Sub FindContractor_WorkingThreadInvoke(ByVal s As Integer,beginform as *NameOfFormComingFrom*) 
If beginform.mouse.InvokeRequired Then 
    Dim d As New FindContractor_WorkingThread(AddressOf FindContractor_WorkingThreadInvoke) 
    beginform.Invoke(d, New Object() {s,beginform}) 
Else 
    beginform.Mouse.OverrideCursor = Cursors.Wait 

    'Do something... 

    beginform.Mouse.OverrideCursor = Nothing 
End If 
End Sub 
관련 문제