Для ожидания на нескольких входах вам нужен WaitHandle для каждого, а затем вы вызываете статический метод WaitHandle.WaitAny .
Но другой вариант - использовать асинхронный ввод-вывод. Используйте BeginXXXX
для запуска операций чтения / получения. Вы предоставляете обратный вызов в каждом случае, который будет выполнен по завершении. После того, как вы их запустите, вы ждете объект монитора и в ответных реакциях вы посылаете этот объект монитора, чтобы уведомить о завершении. Это очень эффективная форма многопоточного программирования, но вам не нужно явно запускать потоки.
Чтобы получить необработанный поток для стандартного ввода, используйте Console.OpenStandardInput .