J'ai une forme qui commence un fil. Maintenant, je veux que le formulaire se ferme automatiquement lorsque ce fil se termine.
La seule solution que j'ai trouvée jusqu'à présent ajoute une minuterie au formulaire et vérifiez si le thread est vivant sur chaque tique. Mais je veux savoir s'il y a une meilleure façon de le faire? P>
Actuellement, mon code regarde plus moins que ceci p>
6 Réponses :
La classe Travailleur de fond existe pour ce type de gestion de thread pour vous sauver avoir à rouler le vôtre; Il propose un événement déroulant à laquelle vous pouvez simplement écouter. P>
Modifier pour que cela puisse appeler une méthode d'assistance, il est donc plus propre.
thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); ... private void OnWorkComplete() { Close(); }
Cela ne fonctionne pas si les méthodes ci-dessus ont des paramètres et plusieurs threads. Sync (param1) prend 30 secondes et lorsqu'il est exécuté surworkComplet, j'ai PARAMX sur le param1 actuel et je reçois de mauvais résultats :(
@Sakthivel, je pense que votre problème est lié à des paramètres non locaux. Vous devez créer une instance locale de votre param1 avant de la transmettre à fonctionner par exemple synchroniser code>
@ Okuma.scott, pourquoi ça ne fonctionne pas? Je n'ai pas de linq mais j'aime .net 4 et ça marche
Mon seul problème est comment passer Param à partir de Sync code> à
Terminer code>
Si vous souhaitez regarder un travailleur d'antécédents, il y a un événement exécuté à la presse qui s'appelle lorsque le travailleur se termine.
Pour plus d'informations sur les collectrés d'arrière-plan Cliquez ici P>
ou B> P>
Vous pouvez ajouter un Appelez à une fonction complète du fil une fois qu'elle est terminée et l'invoque. P>
void Synchronize() { //DoWork(); //FinishedWork(); } void FinishedWork() { if (InvokeRequired == true) { //Invoke } else { //Close } }
Regardez les délégués, IAsyncResultsult, Begininvoke et AsyncCallback P>
à la fin de votre méthode de thread, vous pouvez appeler près () à l'aide de la méthode Invoke () (car la plupart des méthodes WinForms doivent être appelées à partir du fil de l'interface utilisateur):
public void Synchronize() { Invoke(new MethodInvoker(Close)); }