2009-08-28 5 views
1

J'ai un thread parent (non-IU) qui crée des threads enfants pour effectuer des tâches - le parent doit attendre que certaines tâches soient terminées en le fil de l'enfant - cela ne signifie pas que l'enfant est fini mais seulement qu'il a atteint un certain point et le parent peut maintenant continuer le traitement ...Notifier le thread parent lorsque l'enfant a effectué une certaine action [C#]

Pour illustrer s'il vous plaît se référer au code ci-dessous, évidemment ce n'est pas ce que mes enfants le font mais cela montre ce que j'essaie d'accomplir. Rappelons qu'aucun d'entre eux sont des fils UI ...

// Parent Thread 
Thread childThread = new Thread(new ThreadStart(Manage)); 
childThread.IsBackground = true; 
childThread.Name = "NamedPipe Manager"; 
childThread.Start(); 

while (true) 
{ 
... do some work ... 

// wait for signal from MainThread to proceed // 

... do more work 
} 


// Child Thread 
private void Manage() 
{ 
... do some work ... 
... call some functions ... 

// SIGNAL TO PARENT THAT IT CAN CONTINUE // 

... do more work ... 
... call more functions ... 
} 

Quelqu'un a des suggestions sur la façon dont je peux accomplir cette tâche de façon thread-safe? Toute aide serait grandement appréciée. Merci,

Répondre

1

S'il y a enfilez un seul enfant, vous pouvez utiliser un ManualResetEvent:

var signal = new ManualResetEvent(false); 

// child thread: signal to parent that it can continue 
signal.Set(); 

// parent thread: wait for signal from child thread to proceed 
signal.WaitOne(); 

S'il y a enfilez plus d'un enfant, vous pouvez utiliser un Semaphore:

var semaphore = new Semaphore(0, numberOfChildThreads); 

// child thread: signal to parent that it can continue 
semaphore.Release(); 

// parent thread: wait for signal from each child thread to proceed 
for (int i = 0; i < numberOfChildThreads; i++) 
{ 
    semaphore.WaitOne(); 
} 
+0

Que se passe-t-il s'ils sont dans une autre classe? Par exemple, Pareant crée A = new A(); et à l'intérieur de A nous lançons un thread qui doit. Set() le ManualResetEvent() dans le parent? – Shaitan00

+0

Transmettre la référence du signal en tant que paramètre au constructeur A – dtb

1

Vous pouvez le faire en utilisant un WaitHandle (je voudrais ajouter l'exemple de code d'habitude, mais l'exemple donné dans MSDN est presque exactement ce que vous voulez)

+0

Sérieusement? vous pouvez simplement rendre l'autoevent statique? Je pensais que je devrais créer l'AutoEvent et en quelque sorte le passer au fil des enfants ... mais c'est beaucoup plus facile alors je pensais ... Et c'est thread safe? Même si j'ai plusieurs enfants? (seulement besoin d'un seul signal) – Shaitan00

+0

Oui sérieusement, oui il peut être statique, oui il est thread-safe et oui le thread parent passera devant l'appel WaitOne() jusqu'à ce que * tout * autre thread définit le WaitHandle. Vous pouvez utiliser plusieurs WaitHandles et l'appel WaitAll pour attendre * all * les threads enfants pour appeler Set() –

0

Y a-t-il une raison pour laquelle vous utilisez des threads explicites au lieu de BackgroundWorker? BackgroundWorker dispose d'installations intégrées pour communiquer le retour au thread de l'interface utilisateur.

+0

Il n'y a pas de thread UI ... il s'agit en fait d'un service. Recommandez-vous encore d'utiliser BackgroundWorkers? – Shaitan00

+0

Hmm. Aucune idée; Je n'ai jamais essayé, et je ne connais pas grand-chose à sa mise en œuvre, donc je ne pourrais pas le dire. Donc, l'une des autres réponses peut être un meilleur pari. –

Questions connexes