Originariamente inviato da MItaly
La stessa variabile di tipo Thread, vorrai dire; tra l'altro è proprio quello che fai nel codice che hai postato: quando assegni a t un nuovo thread tu assegni alla variabile t un puntatore al nuovo oggetto Thread, e l'oggetto Thread che la variabile puntava in precedenza si trova senza alcun riferimento. Alla prima esecuzione del Garbage Collector quindi l'oggetto Thread in questione verrà eliminato senza pietà, anche se non ho idea di cosa potrà succedere al codice in esecuzione in quel thread.
Ora che ci penso anche la mia soluzione soffre di un problema simile, poiché dichiarando una variabile thread interna al gestore di eventi questa ad un certo punto uscirà dall'ambito di visibilità con effetti per me imprevedibili. L'unica è utilizzare una variabile a livello di classe come avevi detto tu a cui però non venga assegnato mai un nuovo thread a meno che quello precedente non abbia terminato il suo lavoro:
codice:
Private threadExporta As New System.Threading.Thread(AddressOf Esporta) 'Questo thread verrà usato SOLO per l'esportazione per evitare confusione
'...
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
Select Case e.Button.Text
Case Is = "Esporta"
if (myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0 Then
MessageBox.Show("È già in corso l'esportazione dei dati") 'Eventualmente aggiungere un po' di flag di stile
else
threadEsporta.Start()
End If
End Select
End Sub
Private Sub Esporta()
If Me.CHK_Vettore.Checked = True Then
EsportaAnagrafica()
End If
If Me.CHK_Articoli.Checked = True Then
EsportaArticoli()
End If
MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
end sub
In ogni caso al di là della faccenda della variabile locale la mia soluzione dovrebbe risolvere il tuo problema: il gestore di eventi chiama esporta in un thread separato, in modo che l'esportazione dei record proceda in ordine corretto (grazie al fatto che esporta() non crea altri thread e perciò le operazioni in essa contenuta proseguono in ordine sequenziale) ma che al contempo ci sia un thread separato che si occupa di queste operazioni.
I controlli Windows Forms (ProgressBar compresa) non sono thread-safe, quindi non andrebbero MAI chiamati da un thread differente da quello che li ha creati. Si è già parlato di recente di una soluzione che utilizza un timer per ovviare al problema, effettua una ricerca nel forum.
Vedi sopra.