ReadLine() обратный вызов
Когда пользователь вводит команду в мою консоль, мне нужно отправить ее в процесс Java (используя StreamWriter), который я создал. Есть ли способ сделать обратный вызов типа ReadLine, поэтому, когда пользователь набирает что-то в консоли, я могу прочитать это, а затем передать это моему StreamWriter?
Псевдокод:
private void UserCommand(string text)
{
if(string.Equals(text, "save"))
{
inputWriter.WriteLine("/save-all");
}
}
3 ответа
Не напрямую. В отличие от программирования GUI, консольные программы не управляются событиями. Вам придется позвонить Console.ReadLine
явно, который в свою очередь блокирует текущий поток и ждет, пока пользователь не нажмет клавишу ввода. Тогда вы можете позвонить UserCommand
,
Если вы хотите делать другие вещи во время ожидания ввода пользователя, вам придется использовать как минимум два потока, один из которых работает, а другой ожидает ReadLine
вернуть (и затем вызвать любую функцию, которую вы хотите вызвать...)
Вы можете, вероятно, использовать Console.OpenStandardInput
чтобы получить входной поток и использовать асинхронные функции потока.
static string command = "";
static System.IO.Stream s;
static bool quit = false;
static byte[] buf = new byte[1];
static void Main(string[] args)
{
s = Console.OpenStandardInput();
s.BeginRead(buf, 0, 1, new AsyncCallback(s_Read), null);
while (!quit)
{
// Do something instead of sleep
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Sleeping");
}
s.Close();
}
public static void s_Read(IAsyncResult target)
{
if (target.IsCompleted)
{
int size = s.EndRead(target);
string input = System.Text.Encoding.ASCII.GetString(buf);
if (input.EndsWith("\n") || input.EndsWith("\r"))
{
if (command.ToLower() == "quit") quit = true;
Console.Write("Echo: " + command);
command = "";
}
else
command += input;
s.BeginRead(buf, 0, 1, new AsyncCallback(s_Read), null);
}
}