2009-07-22 3 views
5

J'ai un formulaire qui démarre un thread. Maintenant, je veux que le formulaire se ferme automatiquement lorsque ce thread se termine.Appel d'une méthode lorsque le thread se termine

La seule solution que j'ai trouvée jusqu'ici est d'ajouter une minuterie au formulaire et de vérifier si le thread est actif à chaque tick. Mais je veux savoir s'il y a une meilleure façon de faire ça?

Actuellement, mon code ressemble plus moins comme celui-ci

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 
    } 
} 

Répondre

10

La classe BackgroundWorker existe pour ce type de gestion des threads pour vous éviter d'avoir à rouler votre propre; il offre un événement RunWorkerCompleted que vous pouvez simplement écouter.

+0

fonctionne très bien, merci – RaYell

6

Modifiez pour appeler une méthode d'aide afin qu'elle soit plus propre.

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

... 

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

Cela ne fonctionne pas si les méthodes ci-dessus a des paramètres et plusieurs threads. Sync (param1) prend 30 secondes, et quand il exécute OnWorkComplete j'ai paramx sur le param1 actuel et je reçois des résultats erronés :( – Sakthivel

+0

ne fonctionne pas non plus si vous n'avez pas Linq ... –

6

Si vous avez un coup d'oeil à BackgroundWorker, il y a un événement RunWorkerCompleted qui est appelée lorsque le travailleur se termine.

Pour plus d'informations sur BackgroundWorkers Click Here

Ou

Vous pouvez ajouter un appel à une fonction complète du fil une fois qu'il a terminé, et l'invoquer.

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

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

Jetez un oeil à des délégués, IAsyncResult, BeginInvoke et AsyncCallback

1

A la fin de votre méthode de fil, vous pouvez appeler Close() en utilisant la méthode Invoke() (parce que la plupart WinForms méthodes doivent être appelées du thread d'interface utilisateur):

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