2010-03-16 4 views
5

Ho il seguente codice:Me.Invoke in VB.NET in realtà non "Invoke" - discussioni stallo sulla dichiarazione 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 

Il problema è che, quando chiamo il "SetStatusBarText" sub da un altro thread, InvokeRequired è True (come dovrebbe essere), ma i miei thread si bloccano sull'istruzione Me.Invoke - la sospensione dell'esecuzione mostra che sono tutti seduti proprio lì, in realtà non invocando nulla.

Qualche idea sul perché i thread sembrano aver paura di Invoke?

risposta

5

Il metodo Invoke inserisce un messaggio nella coda messaggi per eseguire la chiamata al metodo nel thread principale. Ciò significa che è necessario un thread principale con una pompa di messaggi. Se il thread principale è occupato, o se lo stai facendo in un'applicazione senza un message pump (ad esempio un'applicazione console), il messaggio rimarrà nella coda.

+1

Questo è esattamente quello che stava succedendo - il "Me.Invoke" stava aspettando che il thread principale rispondesse, ma il thread principale era ancora occupato a riempire le cose nel Threadpool mentre i primi thread stavano finendo. Grazie per il tuo consiglio. – SqlRyan

+1

Grazie! Stavo aspettando che gli invocati finissero, ma erano tutti congelati. Ho aggiunto una chiamata a System.Windows.Forms.Application.DoEvents() e funziona. –