2010-03-16 9 views
5

J'ai le code suivant:Me.Invoke en VB.NET ne fait pas « Invoke » - fils de décrochage sur déclaration Invoke

Public Delegate Sub SetStatusBarTextDelegate(ByVal StatusText As String) 
Private Sub SetStatusBarText(ByVal StatusText As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New SetStatusBarTextDelegate(AddressOf SetStatusBarText), StatusText) 
    Else 
     Me.labelScanningProgress.Text = StatusText 
    End If 
End Sub 

Le problème est que, quand je l'appelle la « SetStatusBarText » sub d'un autre thread, InvokeRequired est True (comme il se doit), mais mes threads bloquent sur l'instruction Me.Invoke - l'exécution de la pause les montre tout simplement assis là, n'invoquant rien.

Des pensées sur pourquoi les threads semblent avoir peur de l'Invoke?

Répondre

5

La méthode Invoke place un message dans la file d'attente de messages pour effectuer l'appel de méthode dans le thread principal. Cela signifie que vous avez besoin d'un thread principal avec une pompe de message. Si le thread principal est occupé ou si vous le faites dans une application sans pompe de message (par exemple une application de console), le message restera simplement dans la file d'attente.

+1

C'est exactement ce qui se passait - le "Me.Invoke" attendait que le thread principal réponde, mais le thread principal était encore occupé à bourrer des trucs dans le Threadpool comme les premiers threads étaient en train de finir. Merci pour votre conseil. – SqlRyan

+1

Merci! J'attendais que les Invoke se terminent mais ils étaient tous gelés. J'ai ajouté un appel à System.Windows.Forms.Application.DoEvents() et cela fonctionne. –