2010-03-16 4 views
5

ich den folgenden Code haben:Me.Invoke in VB.NET nicht wirklich "Invoke" - Themen Stall auf Invoke Anweisung

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 

Das Problem ist, dass, wenn ich den "SetStatusBarText" Subw von einem anderen Thread, InvokeRequired ist True (wie es sein sollte), aber dann meine Threads Stall in der Me.Invoke-Anweisung - pausierende Ausführung zeigt ihnen alle nur sitzen dort, nicht tatsächlich etwas aufrufen.

Irgendwelche Gedanken darüber, warum die Threads Angst vor Invoke haben?

Antwort

5

Die Methode Invoke fügt eine Nachricht in die Nachrichtenwarteschlange ein, um den Methodenaufruf im Hauptthread auszuführen. Dies bedeutet, dass Sie einen Haupt-Thread mit einer Nachrichtenpumpe benötigen. Wenn der Hauptthread beschäftigt ist oder wenn Sie dies in einer Anwendung ohne eine Nachrichtenpumpe (z. B. eine Konsolenanwendung) tun, wird die Nachricht nur in der Warteschlange verbleiben.

+1

Genau das passierte - der "Me.Invoke" wartete darauf, dass der Haupt-Thread reagierte, aber der Haupt-Thread war immer noch damit beschäftigt, Sachen in den Threadpool zu packen, als die ersten Threads fertig waren. Danke für deinen Tipp. – SqlRyan

+1

Danke! Ich wartete darauf, dass die Invokes fertig waren, aber sie waren alle eingefroren. Ich habe einen Aufruf von System.Windows.Forms.Application.DoEvents() hinzugefügt und es funktioniert. –