Основываясь на решении apomene, я бы выбрал (реальное) решение на основе таймера, поскольку Thread.Sleep
довольно неточен.
static void PrintSlowly(string print)
{
int index = 0;
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100;
timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, args) =>
{
if (index < print.Length)
{
Console.Write(print[index]);
index++;
}
else
{
Console.Write("\n");
timer.Enabled = false;
}
});
timer.Enabled = true;
}
Таймер возвращается каждые 100 миллисекунд, выбирает следующий символ и печатает его. Если больше символов недоступно, оно печатает возврат и отключает себя. Я написал его, используя метод анонимной обработки, используя лямбда-выражение, а не самый чистый способ. Речь идет только о принципе. Эта реализация выполняется параллельно с вашим приложением, поэтому она не блокирует выполнение кода. Если вы этого хотите, другой подход может быть лучше.
В качестве альтернативы - в качестве модификации решения apomene без занятости - вы можете использовать ManualResetEvent
.
static System.Timers.Timer delay = new System.Timers.Timer();
static AutoResetEvent reset = new AutoResetEvent(false);
private static void InitTimer()
{
delay.Interval = 100;
delay.Elapsed += OnTimedEvent;
delay.Enabled = false;
}
private static void OnTimedEvent(object sender, ElapsedEventArgs e)
{
((System.Timers.Timer)sender).Enabled = false;
reset.Set();
}
static void PrintSlowly2(string print)
{
InitTimer();
foreach (char l in print)
{
Console.Write(l);
delay.Enabled = true;
reset.WaitOne();
}
Console.Write("\n");
}
Он ждет с использованием AutoResetEvent, поэтому другие приложения/потоки могут использовать процессор!
Возможно, сон 100 мс? Ваша игра многопоточная в любом случае? –
'Thread.Sleep (100)'? – stefankmitph
@ bali182 Вы бы сделали многопоточное игровое программное обеспечение в момент обучения, где задавали бы такие вопросы? –