使用计时器延迟char []一次显示所有字符

时间:2012-01-28 15:38:21

标签: c#

我在使用计时器确定在控制台上一次显示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循环中创建一个延迟来获得我需要的效果,但这真的是最好的方法吗?

3 个答案:

答案 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;
}