2009-07-22 4 views
5

Ho un modulo che avvia una discussione. Ora voglio che il modulo si chiuda automaticamente quando questo thread termina.Chiamare un metodo alla chiusura del thread

L'unica soluzione che ho trovato finora è aggiungere un timer al modulo e controllare se il thread è attivo su ogni tick. Ma voglio sapere se c'è un modo migliore per farlo?

Attualmente il mio codice sembra più meno così

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

risposta

10

esiste La classe BackgroundWorker per questo tipo di gestione dei thread per evitare di dover rotolare il proprio; offre un evento RunWorkerCompleted che puoi semplicemente ascoltare.

+0

Funziona alla grande, grazie – RaYell

6

Modificare per chiamare un metodo di supporto in modo che sia più pulito.

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

Questo non funziona se i metodi precedenti hanno parametri e thread multipli. Sync (param1) richiede 30 secondi e quando esegue OnWorkComplete ho paramx sul param1 corrente e ottengo risultati errati :( – Sakthivel

+0

Inoltre non funziona se non hai Linq ... –

6

Se si dispone di uno sguardo a un BackgroundWorker, c'è un evento RunWorkerCompleted che viene chiamato quando il lavoratore viene completata.

Per maggiori informazioni su BackgroundWorkers Click Here

O

Si potrebbe aggiungere una chiamata a una funzione completa dal thread una volta terminato, e richiamarlo.

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

Dai un'occhiata alla delegati, IAsyncResult, BeginInvoke e AsyncCallback

1

Alla fine del tuo metodo di discussione, è possibile chiamare Close() utilizzando il metodo Invoke() (perché i metodi maggior parte delle WinForms dovrebbe essere chiamato dal thread dell'interfaccia utente):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
}