В конце каждого потока ставим блокировку на некоторый общий объект (lock (obj) {}).
Затем удалите текущий поток из коллекции потоков, которые у вас есть.
Если collection.Count меньше 10, создайте новый и поместите в коллекцию.
Отпустите замок.
private List<Thread> threads = new List<Thread>();
private void ThreadFunction() {
// do something
// here before the lock
lock (threads) {
threads.Remove(Thread.CurrentThread);
if (thread.Count < 10) {
Thread t = new Thread(ThreadFunction);
threads.Add(t);
t.Start();
}
}
}
Обязательно перехватите все исключения внутри потока, иначе ваш код потерпит неудачу, когда возникнет исключение потока. Это означает, что часть кода всегда вызывается (кроме исключений Thread abord, но это не имеет значения).
Но, как уже говорилось, я думаю, что вы должны использовать ThreadPool для такой задачи ...