如何使用计时器代替while循环?

时间:2012-02-10 20:09:23

标签: c# timer

目前我正在使用while(true)循环来执行此操作。我不熟悉计时器。谁能告诉我如何将其转换为使用计时器?

string lyricspath = @"c:\lyrics.txt";
TextReader reader = new StreamReader(lyricspath);
int start = 0;
string[] read = File.ReadAllLines(lyricspath);
string join = String.Join(" ", read);
int number = join.Length;
while (true)
{
    Application.DoEvents();
    Thread.Sleep(200);
    start++;
    string str = join.Substring(start, 15);
    byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str);
    label9.Text = str;
    if (start == number - 15)
    {
        start = 0;
    }
}

4 个答案:

答案 0 :(得分:1)

为什么要使用计时器?我认为这是因为你希望应用程序在这么长的操作期间保持响应。如果是这样的cosider使用相同类型的代码但在BackgroundWorker中。

此外,如果您特别想使用计时器,请注意您使用的是哪一个; Systm.Timer在与应用程序热门表单使用的线程不同的线程中调用其事件。表单线程中的Timer in Forms事件。您可能需要在更改标签的计时器回调中调用()操作。

答案 1 :(得分:0)

每200毫秒运行一次。但是,在此之前提出问题之前尝试使用Google的建议是一个很好的建议。

using Timer = System.Windows.Forms.Timer;

private static readonly Timer MyTimer = new Timer();
...
MyTimer.Tick += MyTimerTask;
MyTimer.Interval = 200; // ms
MyTimer.Enabled = true;
...
private void MyTimerTask(Object o, EventArgs ea)
{
    ...
}

答案 2 :(得分:0)

基本上,计时器只是坐在那里计数,每隔X毫秒“滴答”;它会引发一个事件,您可以使用一种方法订阅该事件,该方法每隔X毫秒执行您想要的任何操作。

首先,循环内部需要的所有变量都需要具有“实例范围”;它们必须是当前具有此方法的对象的一部分,而不是像现在这样的“本地”变量。

然后,您当前的方法需要执行while循环之前的所有步骤,设置我提到的“实例”变量,然后创建并启动Timer。 .NET中有几个计时器;最有用的两个可能是System.Windows.Forms.Timer或System.Threading.Timer。这个计时器需要有一个句柄,当它“滴答”时应该调用它应该调用的方法,并且应该被告知“勾选”的频率。

最后,while循环中的所有代码,除了对Application.DoEvents()和Thread.Sleep()的调用外,都应放在Timer“ticks”时运行的方法中。

这样的事情应该有效:

private string[] join;
private int number;
private int start;
private Timer lyricsTimer;

private void StartShowingLyrics()
{
   string lyricspath = @"c:\lyrics.txt";
   TextReader reader = new StreamReader(lyricspath);
   start = 0;
   string[] read = File.ReadAllLines(lyricspath);
   join = String.Join(" ", read);
   number = join.Length;

   lyricsTimer = new System.Windows.Forms.Timer();
   lyricsTimer.Tick += ShowSingleLine;
   lyricsTimer.Interval = 300;
   lyricsTimer.Enabled = true;
}


private void ShowSingleLine(object sender, EventArgs args)
{
    start++;
    string str = join.Substring(start, 15);
    byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str);
    label9.Text = str;
    if (start == number - 15)
    {
        start = 0;
    }
}

答案 3 :(得分:0)

只需定义一个新的计时器:

        Timer timer1 = new Timer();
        timer1.Interval = 1; // Change it to any interval you need.
        timer1.Tick += new System.EventHandler(this.timer1_Tick);
        timer1.Start();

然后定义一个将在每个计时器滴答中调用的方法(每[Interval]毫秒):

    private void timer1_Tick(object sender, EventArgs e)
    {
        Application.DoEvents();
        Thread.Sleep(200);
        start++;
        string str = join.Substring(start, 15);
        byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str);
        label9.Text = str;
        if (start == number - 15)
        {
            start = 0;
        }
    }

* 请记住在方法之外定义变量,以便您可以在timer1_Tick方法中访问它们。