2010-06-11 4 views
0

J'ai écrit un thread que j'ai commencé à utiliser la méthode start mais je ne suis pas capable de savoir quand le thread a fini d'exécuter la méthode et de détruire l'objet thread.Exécution de thread .Net

_ProgressThread = New Thread(AddressOf ExecProc) 
_ProgressThread.IsBackground = False 
_ProgressThread.Start() 

//the flow of execution should come here only after the thread has executed the method 
//but its coming and executing this line after the thread has started. 
Me.MainInit() 
_ProgressThread = Nothing 

Quelle est la meilleure méthode. S'il vous plaît aider. Aussi je veux appeler une méthode après que le thread ait fini d'exécuter la méthode.

Répondre

1

Il y a deux (ou plus) moyens possibles. La première consiste à utiliser un ManualResetEvent comme suit:

_Event = New ManualResetEvent(False); <-- Create event globally 

Ensuite, dans le code de démarrage de votre fil:

_ProgressThread = New Thread(AddressOf ExecProc) 
_ProgressThread.IsBackground = False 
_ProgressThread.Start() 

//the flow of execution should come here only after the thread has executed the method 
//but its coming and executing this line after the thread has started. 
_Event.WaitOne(); <-- This waits! 
_Event.Close(); <-- This closes the event 

Me.MainInit() 
_ProgressThread = Nothing 

Dans votre méthode de fil, vous devez appeler _Event.Set() avant le retour de la méthode dans tous les cas, sinon, votre application sera bloquée.

Une autre méthode consiste à devoir appeler un délégué lorsque vous avez terminé. Le code que vous souhaitez exécuter une fois le thread terminé (Me.MainInit()) est ensuite placé dans la méthode déléguée. C'est en fait assez élégant.

Par exemple:

public delegate void ThreadDoneDelegate(); 

private void ExecProc() 
{ 
    ThreadDoneDelegate del = new ThreadDoneDelegate(TheThreadIsDone); 

    ... // Do work here 

    this.Invoke(del); 
} 

private void TheThreadIsDone() 
{ 
    ... // Continue with your work 
} 

Désolé, je ne speek VB couramment, vous devrez convertir ce petit C# snippet :-)

+0

Pas de problème. Je comprends les deux mondes. Merci quand même. –

+0

Un problème me vient de définir la valeur d'une barre de progression dans la méthode thread. Ainsi, chaque fois que j'écris _event.set() avant de définir la valeur de la barre de progression, elle revient de la méthode et exécute la méthode maininit(). –

+0

Vous n'appelez pas _event.Set() lors de la mise à jour de la barre de progression. Vous l'appelez seulement avant que votre méthode de thread n'existe réellement (soit à cause d'erreurs, soit parce que c'est fini). –

2

Premièrement, définir une variable sur Nothing ne détruit pas l'objet. Deuxièmement, s'il s'agit d'une variable d'instance mais que vous n'en avez pas besoin après avoir démarré le thread, pourquoi ne pas l'utiliser du tout? S'il s'agit d'une variable locale, laissez-la tomber hors de portée. Fondamentalement, ce n'est pas à vous de «détruire» l'objet - c'est à vous de ne garder une référence que si cela vous intéresse.

Si cela n'a pas aidé, veuillez fournir plus de détails.

+0

Je veux exécuter une méthode après que le fil a fait exécuter la méthode, mais la fonction est appelée avant que le thread a terminé son exécution. –

+0

@Soham: La chose la plus simple à faire serait de ne pas démarrer "ExecProc" directement pour le thread, mais une méthode qui appelle 'ExecProc', puis exécute l'autre méthode. –

2

Si je comprends bien, vous voulez Attendez qu'un fil se termine. Cela peut être acomplished par joining le fil:

_ProgressThread = New Thread(AddressOf ExecProc) 
_ProgressThread.IsBackground = False 
_ProgressThread.Start() 

// you can do parallel work here 

// wait for the thread to finish 
_ProgressThread.Join(); 
+0

Vous avez raison, mais la réponse de Thorsten Dittmar fonctionne correctement, le seul problème est que l'interface utilisateur de la barre de progression ne se met pas à jour et que l'application entre dans une impasse. Pouvez-vous me donner une suggestion en fonction de sa réponse? Merci quand même. –

+0

Il est un peu exagéré (IMHO) de créer un événement lorsque vous pouvez simplement utiliser le fil obj. Quoi qu'il en soit, je suppose que vous essayez de mettre à jour la barre de progression dans le fil droit? Si c'est le cas, vous devez rassembler l'appel au thread de l'interface utilisateur à l'aide des membres control.InvokeRequired /control.Invoke(). Pour plus de détails, voir http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.invokerequired(v=VS.100).aspx – Vagaus

Questions connexes