Существует способ перестановок:
>>> import itertools
>>> chars = "ABCD"
>>> perms = list(itertools.permutations(chars))
>>> print(perms)
[('A', 'B', 'C'),
('A', 'C', 'B'),
('B', 'A', 'C'),
('B', 'C', 'A'),
('C', 'A', 'B'),
('C', 'B', 'A')]
Достаточно странно можно найти что-то на Присвоении Информатики, распределение работы по программированию CSC 512 4: многопоточный Сервер С Шаблонами. Altough это - вуду C++, но теория довольно понятна для кого-то, кто может сделать C#.
Altough можно получить целый список хороших чтений на основной странице.
Смотрите на этот предыдущий вопрос:
Как Вы минимизируете количество потоков, используемых в tcp серверном приложении?
Это не строго конкретный C#, но это имеет некоторый хороший совет.