Je peux voir les 5 options disponibles:
1. Fil de discussion.Rejoindre
Comme avec Mitch réponse. Mais cela va bloquer votre thread de l'INTERFACE utilisateur, cependant, vous obtenez un Délai d'attente construit pour vous.
2. Utiliser un WaitHandle
ManualResetEvent
est WaitHandle
comme jrista suggéré.
Une chose à noter est que si vous voulez attendre plusieurs threads, WaitHandle.WaitAll()
ne fonctionne pas par défaut, car il a besoin d'un thread MTA. Vous pouvez contourner ce problème en marquant votre Main()
méthode de MTAThread
- toutefois cela bloque votre pompe de message et n'est pas recommandé à partir de ce que j'ai lu.
3. Le feu à un événement
Voir cette page par Jon Skeet sur les événements et le multi-threading, il est possible qu'un événement peut être unsuscribed entre l' if
et de la EventName(this,EventArgs.Empty)
- c'est arrivé à moi avant.
(J'espère que ces compiler, je n'ai pas essayé)
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_count = 1;
}
void HandleThreadDone(object sender, EventArgs e)
{
// You should get the idea this is just an example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread2 = new Thread(worker.Run);
thread2.Start();
_count++;
}
}
class ThreadWorker
{
public event EventHandler ThreadDone;
public void Run()
{
// Do a task
if (ThreadDone != null)
ThreadDone(this, EventArgs.Empty);
}
}
}
4. L'utilisation d'un délégué
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker(HandleThreadDone);
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_count = 1;
}
void HandleThreadDone()
{
// As before - just a simple example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
Thread thread2 = new Thread(worker.Run);
thread2.Start(HandleThreadDone);
_count++;
}
}
class ThreadWorker
{
// Switch to your favourite Action<T> or Func<T>
public void Run(object state)
{
// Do a task
Action completeAction = (Action)state;
completeAction.Invoke();
}
}
}
Si vous utilisez le _count méthode, il pourrait être une idée (pour être sûr) d'un accroissement de l'aide
Interlocked.Increment(ref _count)
Je serais curieux de savoir la différence entre les délégués et les événements pour le fil de notification, à la seule différence que je connais sont des événements sont appelés de manière synchrone.
5. Le faire de façon asynchrone à la place
La réponse à cette question a une description très claire de vos options avec cette méthode.
Délégué/Événements sur le mauvais fil
L'événement/de la délégué façon de faire les choses vont dire que votre gestionnaire d'événement de la méthode est sur thread1/thread2 pas la principale thread d'INTERFACE utilisateur, de sorte que vous aurez besoin pour passer en arrière à droite en haut de la HandleThreadDone méthodes:
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}