我在使用计时器确定在控制台上一次显示1个字符的最佳方法时遇到了一些麻烦。我们的想法是在屏幕上显示一个RPG风格的消息流,而不是一次性粘贴。
private static System.Timers.Timer aTimer;
public void DisplayTime()
{
aTimer = new System.Timers.Timer(5000);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.AutoReset = false;
aTimer.Enabled = true;
Console.ReadLine();
}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
string text;
text = "This is a test";
char[] message = new char[text.Length];
message = text.ToCharArray();
for (int i = 0; i < message.Length; i++)
{
Console.Write(message[i]);
}
}
这就是我目前所拥有的只是延迟显示消息5秒钟的内容。我试图避免使用Thread.Sleep,如果可能的话,因为从我所读到的这是一个很大的不,不。我知道我需要在for循环中创建一个延迟来获得我需要的效果,但这真的是最好的方法吗?
答案 0 :(得分:2)
使用Thread.Sleep()
。它将提供您所需要的,没有任何缺点。您所听到的关于Sleep()
的内容完全脱离了上下文,并不适用于您的情况。
答案 1 :(得分:2)
这是使用lambda的好地方。
public void DisplayTime(string message) {
var index = 0;
var timer = new System.Timers.Timer(5000);
timer.Elapsed += delegate {
if (index < message.Length) {
Console.Write(message[index]);
index++;
} else {
timer.Enabled = false;
timer.Dispose();
}
};
timer.Enabled = true;
}
现在你可以打电话给DisplayTime("the message")
,它会慢慢每隔5秒写出一个字符,并在计时器结束时清理它
答案 2 :(得分:1)
您需要跟踪角色流中的位置 - 似乎您希望一次只显示一个角色,然后暂停一下,直到您显示所有角色。计时器对此非常合适 - 您必须将消息和消息中的当前位置作为实例变量跟踪:
private int messagePosition = 0;
private string message = "This is a test";;
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
if(messagePosition < message.Length)
{
Console.Write(message[messagePosition]);
messagePosition++;
}
else
aTimer.Enabled = false;
}