Вызов Console.ReadLine () в делегате - это плохо, потому что если пользователь не нажмет «enter», этот вызов никогда не вернется. Поток, выполняющий делегат, будет заблокирован до тех пор, пока пользователь не нажмет «enter», и отменить его невозможно.
Выдача последовательности этих вызовов не будет вести себя так, как вы ожидаете. Рассмотрим следующее (используя пример класса Console сверху):
System.Console.WriteLine("Enter your first name [John]:");
string firstName = Console.ReadLine(5, "John");
System.Console.WriteLine("Enter your last name [Doe]:");
string lastName = Console.ReadLine(5, "Doe");
Пользователь позволяет истечь тайм-аут для первого приглашения, а затем вводит значение для второго запроса. И firstName, и lastName будут содержать значения по умолчанию. Когда пользователь нажимает «enter», первый вызов ReadLine будет завершен, но код откажется от этого вызова и по существу отбросит результат. Вызов second ReadLine будет продолжать блокироваться, время ожидания истечет, а возвращаемое значение снова станет значением по умолчанию.
Кстати, в приведенном выше коде есть ошибка. Вызывая waitHandle.Close (), вы закрываете событие из-под рабочего потока. Если пользователь нажимает «enter» после истечения времени ожидания, рабочий поток попытается сообщить о событии, которое вызывает исключение ObjectDisposedException. Исключение выдается из рабочего потока, и если вы не настроили обработчик необработанного исключения, ваш процесс завершится.