Консольный ввод и вывод C# одновременного?

Это не ошибка, на самом деле действие вызова

i.atOffset(ZoneOffset.UTC)

запускает создание объекта OffsetDateTime, который javadoc четко утверждает следующее

Минимальный поддерживаемый OffsetDateTime, '-999999999-01-01T00: 00: 00 + 18: 00'.

blockquote>

Так что, в принципе, если вы сохраните его Instant, это нормально, но попытка изменить его может вызвать проблему

7
задан Alex Turpin 11 May 2009 в 20:11
поделиться

5 ответов

Я начал работу над тестовой программой, чтобы показать, как можно разделить консоль на область вывода и область ввода, где область ввода перемещается вниз по мере того, как область вывода расширяется за счет большего количества вывода. Он еще не идеален, но вы можете развить его в ответ, который ищете:

  static int outCol, outRow, outHeight = 10;

  static void Main(string[] args)
  {
     bool quit = false;
     System.DateTime dt = DateTime.Now;
     do
     {
        if (Console.KeyAvailable)
        {
           if (Console.ReadKey(false).Key == ConsoleKey.Escape)
              quit = true;
        }
        System.Threading.Thread.Sleep(0);
        if (DateTime.Now.Subtract(dt).TotalSeconds > .1)
        {
           dt = DateTime.Now;
           WriteOut(dt.ToString(" ss.ff"), false);
        }            
     } while (!quit);
  }

  static void WriteOut(string msg, bool appendNewLine)
  {
     int inCol, inRow;
     inCol = Console.CursorLeft;
     inRow = Console.CursorTop;

     int outLines = getMsgRowCount(outCol, msg) + (appendNewLine?1:0);
     int outBottom = outRow + outLines;
     if (outBottom > outHeight)
        outBottom = outHeight;
     if (inRow <= outBottom)
     {
        int scrollCount = outBottom - inRow + 1;
        Console.MoveBufferArea(0, inRow, Console.BufferWidth, 1, 0, inRow + scrollCount);
        inRow += scrollCount;
     }
     if (outRow + outLines > outHeight)
     {
        int scrollCount = outRow + outLines - outHeight;
        Console.MoveBufferArea(0, scrollCount, Console.BufferWidth, outHeight - scrollCount, 0, 0);
        outRow -= scrollCount;
        Console.SetCursorPosition(outCol, outRow);
     }
     Console.SetCursorPosition(outCol, outRow);
     if (appendNewLine)
        Console.WriteLine(msg);
     else
        Console.Write(msg);
     outCol = Console.CursorLeft;
     outRow = Console.CursorTop;
     Console.SetCursorPosition(inCol, inRow);
  }

  static int getMsgRowCount(int startCol, string msg)
  {
     string[] lines = msg.Split('\n');
     int result = 0;
     foreach (string line in lines)
     {
        result += (startCol + line.Length) / Console.BufferWidth;
        startCol = 0;
     }
     return result + lines.Length - 1;
  }
4
ответ дан 7 December 2019 в 03:20
поделиться

Если вам нужно разрешить вывод вывода, пока пользователь печатает, я рекомендую отправить вывод в новое окно. Итак, у вас может быть одно окно, которое используется для запуска приложения, а затем оно порождает поток для открытия новой консоли для ввода, а затем продолжает отправлять любые выходные сообщения в исходное окно. Я думаю, что вы столкнетесь со слишком большим количеством проблем с блокировкой ресурсов, если попытаетесь сохранить все в одном окне.

1
ответ дан 7 December 2019 в 03:20
поделиться

Вы пытались вызвать OpenStandardInput , прочитать любой ввод и сбросить его положение, а затем записать в выходной поток. После этого вы можете снова вызвать OpenStandardInput и снова ввести данные в поток.

0
ответ дан 7 December 2019 в 03:20
поделиться

Думаю, идеального способа добиться этого нет. То, что делает telnet (по крайней мере, последняя версия, которую я использовал), не выводит никаких входных данных (просто прочитайте нажатия клавиш), а просто распечатывает вывод по мере его поступления. Альтернативой является сохранение любых данных, которые необходимо вывести на консоль, в буфере и печать их только после того, как пользователь завершит ввод своей команды. (Вы можете даже поставить отметку времени для вывода, чтобы сделать его более очевидным.) Я действительно не вижу здесь лучшей альтернативы - вы неизбежно столкнетесь с проблемами, используя интерфейс синхронного ввода-вывода (то есть командную строку) вместе с асинхронные операции в серверной части.

0
ответ дан 7 December 2019 в 03:20
поделиться

Проблемы такого рода становятся несколько более простой проблемой, если рассматривать сервер как приложение клиент / сервер. Пусть сервер имеет "n" подключений к клиентским административным приложениям, которые отправляют команды и принимают выходные данные. Клиентское приложение может полностью разделить ввод и вывод, имея один поток для обработки ввода и один для обработки вывода.

Выходной поток может блокироваться, если входной поток находится в середине ввода строки, и разблокировать, когда строка либо отменено, либо зафиксировано.

1
ответ дан 7 December 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: