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 вернуть (и затем вызвать любую функцию, которую вы хотите вызвать...)

Да уж.

string input = Console.ReadLine();
UserCommand(input);

Вы можете, вероятно, использовать 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);
        }
    }
Другие вопросы по тегам