あなたが求めていることを具体的に行うために作られているので、ManualResetEventを調べてください。
スレッドは新しいリセット イベントを作成し、メイン スレッドが実行中のスレッドがあるかどうかを確認するために使用できるアクセス可能なキューに追加します。
// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();
必要に応じてさらにサンプル コードを提供することもできますが、基本的には、1 年ほど前にこれを行う必要があったときに読んだいくつかの記事からコピーしただけです。
言い忘れましたが、タイマーが起動したときに取得するデフォルトのスレッドにこの機能を追加することはできません。そのため、タイマー ハンドラーを非常に無駄のないものにし、新しいワーカー スレッドを準備して開始するだけのことを行う必要があります。
...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
myCustomObjectThatContainsAResetEvent);