Это не ошибка, на самом деле действие вызова
i.atOffset(ZoneOffset.UTC)
запускает создание объекта OffsetDateTime
, который javadoc четко утверждает следующее
Минимальный поддерживаемый OffsetDateTime, '-999999999-01-01T00: 00: 00 + 18: 00'.
blockquote>Так что, в принципе, если вы сохраните его
Instant
, это нормально, но попытка изменить его может вызвать проблему
Я начал работу над тестовой программой, чтобы показать, как можно разделить консоль на область вывода и область ввода, где область ввода перемещается вниз по мере того, как область вывода расширяется за счет большего количества вывода. Он еще не идеален, но вы можете развить его в ответ, который ищете:
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;
}
Если вам нужно разрешить вывод вывода, пока пользователь печатает, я рекомендую отправить вывод в новое окно. Итак, у вас может быть одно окно, которое используется для запуска приложения, а затем оно порождает поток для открытия новой консоли для ввода, а затем продолжает отправлять любые выходные сообщения в исходное окно. Я думаю, что вы столкнетесь со слишком большим количеством проблем с блокировкой ресурсов, если попытаетесь сохранить все в одном окне.
Вы пытались вызвать OpenStandardInput , прочитать любой ввод и сбросить его положение, а затем записать в выходной поток. После этого вы можете снова вызвать OpenStandardInput и снова ввести данные в поток.
Думаю, идеального способа добиться этого нет. То, что делает telnet (по крайней мере, последняя версия, которую я использовал), не выводит никаких входных данных (просто прочитайте нажатия клавиш), а просто распечатывает вывод по мере его поступления. Альтернативой является сохранение любых данных, которые необходимо вывести на консоль, в буфере и печать их только после того, как пользователь завершит ввод своей команды. (Вы можете даже поставить отметку времени для вывода, чтобы сделать его более очевидным.) Я действительно не вижу здесь лучшей альтернативы - вы неизбежно столкнетесь с проблемами, используя интерфейс синхронного ввода-вывода (то есть командную строку) вместе с асинхронные операции в серверной части.
Проблемы такого рода становятся несколько более простой проблемой, если рассматривать сервер как приложение клиент / сервер. Пусть сервер имеет "n" подключений к клиентским административным приложениям, которые отправляют команды и принимают выходные данные. Клиентское приложение может полностью разделить ввод и вывод, имея один поток для обработки ввода и один для обработки вывода.
Выходной поток может блокироваться, если входной поток находится в середине ввода строки, и разблокировать, когда строка либо отменено, либо зафиксировано.