ReadLine () обратный вызов - PullRequest
0 голосов
/ 03 марта 2011

Когда пользователь вводит команду в моей консоли, мне нужно отправить ее в процесс Java (с помощью StreamWriter), который я создал.Есть ли способ сделать обратный вызов типа ReadLine, поэтому, когда пользователь набирает что-то в консоли, я могу прочитать его, а затем передать его моему StreamWriter?

Псевдокод:

private void UserCommand(string text)
{
    if(string.Equals(text, "save"))
    {
        inputWriter.WriteLine("/save-all");
    }
}

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Не напрямую.В отличие от программирования GUI, консольные программы не управляются событиями.Вам придется явно вызывать Console.ReadLine, что, в свою очередь, блокирует текущий поток и ждет, пока пользователь не нажмет клавишу Enter.Затем вы можете позвонить своему UserCommand.

. Если вы хотите делать другие вещи, ожидая ввода пользователя, вам придется использовать как минимум два потока, один из которых работает, а другой ждет ReadLineвернуть (и затем вызвать любую функцию, которую вы хотите вызвать ...)

1 голос
/ 03 марта 2011

Да.

string input = Console.ReadLine();
UserCommand(input);
0 голосов
/ 03 марта 2011

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