Ich kann 5 verfügbare Optionen sehen:
1. Thread.Join
Wie bei Mitch's Antwort. Dies blockiert jedoch Ihren UI-Thread, Sie erhalten jedoch ein Timeout, das für Sie integriert ist.
2. Verwenden Sie a WaitHandle
ManualResetEventist ein WaitHandlewie jrista vorgeschlagen.
Wenn Sie auf mehrere Threads warten möchten, WaitHandle.WaitAll()funktioniert dies standardmäßig nicht, da ein MTA-Thread erforderlich ist. Sie können dies umgehen, indem Sie Ihre Main()Methode mit markieren. MTAThreadDies blockiert jedoch Ihre Nachrichtenpumpe und wird nach dem, was ich gelesen habe, nicht empfohlen.
3. Feuern Sie ein Ereignis ab
Auf dieser Seite von Jon Skeet finden Sie Informationen zu Ereignissen und Multithreading. Es ist möglich, dass ein Ereignis zwischen dem ifund dem nicht mehr abonniert wirdEventName(this,EventArgs.Empty) - es ist mir schon einmal passiert.
(Hoffentlich kompilieren diese, ich habe es nicht versucht)
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. Verwenden Sie einen Delegaten
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
Thread thread1 = new Thread(worker.Run);
thread1.Start(HandleThreadDone);
_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();
}
}
}
Wenn Sie die Methode _count verwenden, ist es möglicherweise (aus Sicherheitsgründen) eine Idee, sie mit zu erhöhen
Interlocked.Increment(ref _count)
Mich würde interessieren, welchen Unterschied es zwischen der Verwendung von Delegaten und Ereignissen für die Thread-Benachrichtigung gibt. Der einzige Unterschied, den ich kenne, besteht darin, dass Ereignisse synchron aufgerufen werden.
5. Tun Sie es stattdessen asynchron
Die Antwort auf diese Frage enthält eine sehr klare Beschreibung Ihrer Optionen mit dieser Methode.
Delegate / Events im falschen Thread
Die Veranstaltung / Delegierten Art , die Dinge werden Ihre Event - Handler bedeuten Methode ist auf thread1 / thread2 nicht die Haupt - UI - Thread , so müssen Sie direkt an der Spitze der HandleThreadDone Methoden zurückschalten:
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}