Это может быть не совсем связано с тем, почему вещи замораживаются, но ваша реализация весьма сомнительна. Вы перечисляете коллекцию потоков, запускаете каждый из них, но затем блокируете, пока поток не закончится? Я думаю, что вы, возможно, хотели сделать, это запустить все потоки, а затем блокировать, пока все потоки не закончатся. (Примечание: это предполагает, что вы хотели написать: " while (t.IsAlive) {} ", поскольку ожидание запуска потока имеет еще меньше смысла.)
Что касается замораживания, нам может понадобиться увидеть остальную часть кода. Поскольку вы сказали, что вы новичок в многопоточности C # и, глядя на то, что вы делали выше, я предполагаю, что вы новичок в многопоточности, что означает, что может быть много мест, где может возникнуть проблема.