为什么我的winforms秒表上的时间很慢

本文关键字:时间 我的 winforms 为什么 | 更新日期: 2023-09-27 18:00:53

我创建了一个小型winforms程序作为一个小型秒表程序。我的主要问题是时间更新得很慢
例如,我的秒表程序大约需要3.5秒才能通过1秒,我正试图弄清楚是否有更好的方法来处理时间?

我试图包括代码的所有相关部分,并且只包括代码的相关部分。

全局变量:

System.Windows.Forms.Timer microTimer;
EventHandler microTick;
AlertBox box;
string message;
Stopwatch watch;

设置定时器的方法

private void SetTimer(int miliseconds)
    {
        microTimer.Interval = miliseconds;
        microTimer.Enabled = true;
        microTimer.Tick += microTick;
        microTimer.Start();
    }

我的事件逻辑背后的理论是,对于计时器上的每一个刻度,它都会检查秒表上的时间,并用经过的时间更新我表单上的标签。

microTick = (m_sender, m_e) =>
            {
                TimeSpan t = new TimeSpan(watch.ElapsedTicks);
                lblTimeDisplay.Text = t.Minutes + " : " + t.Seconds + " : " + t.Milliseconds;
            };

这是我的点击事件!

private void btnStart_Click(object sender, EventArgs e)
    {
        SetTimer(1); //I copied this earlier in the message.
        watch.Start();
    }

感谢

为什么我的winforms秒表上的时间很慢

1:最好在启动计时器之前启动秒表。。。不是在…之后。。。

2:为了在表单上正确显示时间,您需要在单独的线程上运行计时器的刻度。。。以1毫秒的间隔运行计时器将循环得如此之快,以至于它将锁定显示线程,因此后端的"UpdateDisplay"调用将无法快速启动以刷新屏幕,从而在值更改时准确地表示值。。。要确认这一点,请尝试SetTimer(1000(。。。那么它将每1秒准确显示一次。。。

要了解如何做到这一点,只需在谷歌中查找C#的线程。

这里是根据需要运行的代码的基本版本。我不得不在一个新线程中创建秒表,使其以正常速度运行。

我的用法:

using System.Threading; 

主代码:

全局变量:

private new Thread starter;
private bool isThreadRunning = false;

点击事件:

private void button1_Click(object sender, EventArgs e)
{
    this.isThreadRunning = true;
    //create new thread to run stopwatch in
    this.starter = new Thread(new ThreadStart(this.HandleTime)); 
    this.starter.Start();
}
private void button2_Click(object sender, EventArgs e)
{
    //cause the thread to end itself
    this.isThreadRunning = false;
}

在线程内运行的代码

//HandleTime is inside the new thread
private void HandleTime()
{
    Stopwatch threadStopwatch = new Stopwatch();
    TimeSpan timespan;
    threadStopwatch.Start();
    while (this.isThreadRunning)
    {
        timespan = threadStopwatch.Elapsed;
        //using invoke to update the label which is in the original thread 
        //and avoid a cross thread exception
        if (this.InvokeRequired)
            {
                //read up on lamda functions if you don't know what this is doing
                this.Invoke(new MethodInvoker(() => 
                    label1.Text = timespan.Minutes + " : " + timespan.Seconds + " : " + timespan.Milliseconds
                    ));
            }
            else
            {
                label1.Text = timespan.Minutes + " : " + timespan.Seconds + " : " + timespan.Milliseconds;
            }
    }
}