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

本文关键字:while 循环 何使用 计时器 | 更新日期: 2023-09-27 18:24:17

目前我正在使用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;
    }
}

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

为什么要使用计时器?我想这是因为你想让应用程序在这么长的操作过程中保持响应。如果是这样的话,请使用相同种类的代码,但在BackgroundWorker中。

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

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

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

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

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

像这样的东西应该起作用:

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

每200毫秒运行一次。但在这里提问之前尝试谷歌的建议是好的。

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)
{
    ...
}

只需定义一个新计时器:

        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方法中访问它们