private static void Variant_2_New() { const string digitsTemolate = "##"; const int digitsOffset = 48; const int offsetLeft = 20; const int offsetTop = 20; var timeString = $"Минское время {digitsTemolate}:{digitsTemolate}:{digitsTemolate}. Говорят и показывают все телестанции страны... "; //выводиая строка var buffer = timeString.ToCharArray(); var hoursIndex = timeString.IndexOf(digitsTemolate); var munitsIndex = timeString.IndexOf(digitsTemolate, hoursIndex + 1); var secondsIndex = timeString.IndexOf(digitsTemolate, munitsIndex + 1); //Выводим рамку CH.DrawRect(new Position(offsetLeft - 1, offsetTop - 1), new Size(LineSize, 1)); CH.SetConsoleColor(ConsoleColor.DarkYellow); //Цвет текста var currentPosition = 0; while (true) { //'Обновляем' время в буфере, если оно изменилось var newTime = DateTime.Now; buffer[hoursIndex] = newTime.Hour < 10 ? '0' : (char)(newTime.Hour / 10 + digitsOffset); buffer[hoursIndex + 1] = (char)(newTime.Hour % 10 + digitsOffset); buffer[munitsIndex] = newTime.Minute < 10 ? '0' : (char)(newTime.Minute / 10 + digitsOffset); buffer[munitsIndex + 1] = (char)(newTime.Minute % 10 + digitsOffset); buffer[secondsIndex] = newTime.Second < 10 ? '0' : (char)(newTime.Second / 10 + digitsOffset); buffer[secondsIndex + 1] = (char)(newTime.Second % 10 + digitsOffset); var charsToStringEnd = buffer.Length - currentPosition; // Находим остаток до конца буфера Console.SetCursorPosition(offsetLeft, offsetTop); // прыгаем в начало бегущей стоки if (charsToStringEnd >= LineSize) //если хватает то виыводим так { Console.Write(buffer, currentPosition, LineSize); } else // если нет, то добисываем с начала буфера { Console.Write(buffer, currentPosition, charsToStringEnd); Console.Write(buffer, 0, LineSize - charsToStringEnd); } Thread.Sleep(SleepInterval); //Поток спит currentPosition = ++currentPosition % buffer.Length; //Идём на следующий символ } }