C# 定时器不工作?

标签 c# .net winforms visual-studio-2008 timer

这是表格 1

我正在尝试使用 form2 中的变量级别来设置 form1 中的计时器间隔

    int time = 0;


    public Form1()
    {

        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        time++;

计时器的间隔根据位于 form2 中的变量“level”的值来设置

       if (Form8.level.Equals("expert"))
        {

            timer1.Interval = 10000;


            if (time == 10000)
            {

                timer1.Stop();
                MessageBox.Show("time ended");
            }
        }
        else
        {

            timer1.Equals(60000);


            if (time==60000)
            {
                timer1.Stop();
                MessageBox.Show("time ended");
            }
        }
    }

这是Form2

这是我想在 form1 中使用的变量

     public Static String level = ""; 


    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();


        Form1 f1 = new Form1(); 
        f1.Show();
    }

最佳答案

一般建议

好吧,我不认为您的代码真的是错误的,只是存在一些问题可能会让人觉得您的代码无法正常工作。

首先,我建议您考虑更合适地命名您的类。我个人倾向于根据其功能来命名我的表单。因此,您可能会考虑将 Form8 重命名为 DifficultyForm。这样就更容易理解你的代码。此外,像 elapsedLevelTime 这样的名称可以让我们了解计时器的用途。如果其他人查看您的代码,他们不会真正知道 timer1使用

问题回顾

现在让我们快速回顾一下代码应该做什么:用户似乎选择了某种难度。然后,显示另一个窗口。在显示的窗口中,计时器应该递增,直到达到特定时间。然后将显示文本“时间结束”。

正如您所描述的,您在设计器中创建了很多东西。所以我假设所有事件都已正确附加。由此得出的结论是,罪魁祸首位于您的 timer1_elapsed 中,该代码实际上计算耗时:

private void timer1_Tick(object sender, EventArgs e)
{
    time++;
    if (Form8.level.Equals("expert"))
    {

        timer1.Interval = 10000;


        if (time == 10000)
        {

            timer1.Stop();
            MessageBox.Show("time ended");
        }
    }
    else
    {

        timer1.Equals(60000);


        if (time==60000)
        {
            timer1.Stop();
            MessageBox.Show("time ended");
        }
    }
}

算法的作用以及可能的陷阱

调试算法时,Rubber duck debugging尽管名字很有趣,但这是一种有值(value)的方法。那么让我们单步调试您的代码。

  • 加载表单后,计时器就会启动。您并未真正指定计时器设置,但默认计时器的间隔为 100 毫秒。因此 tick 方法每秒引发大约 10 次。

  • 当计时器计时时,时间将增加一。因此,1 秒后,时间 将为 10。

  • 现在您正在检查所选级别是否为专家。所以我们必须在这里选择:

    a.水平是专家。在这种情况下,您可以将间隔设置为 10000。这将导致每 10 秒引发一次 tick 事件。然后,您检查 time 变量是否为 10000。如果是这种情况,您将结束计时器并显示“时间结束”。这里有两个问题:

    1. 您使用的是 if (time == 10000) 而不是 if (time >= 10000)。这样,如果 time 变量在未经检查的情况下被更新,您的计时器将永远不会完成
    2. 由于将间隔设置为 10000,该条件将在 10000 * 10s 秒(大约 27 小时)后达到。

    b.水平不是专家。您的代码也存在一些问题:

    1. timer1.Equals(60000); 在这里是一个无用的语句。 Equals 方法主要检查是否 timer1 == 60000;
    2. if 条件同样可能存在问题。见上文:a1
    3. 由于默认间隔为 100 毫秒,因此将在 60000 * 0.1s(大约 100 分钟)后达到该条件。

可能的解决方案

以下是一些改进代码的建议:

  • 设置滴答事件之外的计时器间隔。看起来需要 仅设置一次。

  • 检查timer1.Equals(60000)的用法

  • 检查您是否真的想要这些长间隔

  • 确保您了解 time 包含什么值,以及它增加的频率

我尝试在一个小型 WindowsForm 项目中使用可能的解决方案重新创建您的问题:

public partial class Form1 : Form
{
    private Timer secondMeasureTimer;
    private int elapsedTime; //in seconds

    private string level = "expert";

    public Form1()
    {
        InitializeComponent();

        secondMeasureTimer = new Timer();
        secondMeasureTimer.Tick += secondMeasureTimer_Tick;
        secondMeasureTimer.Interval = 1000; // 1 second resolution
    }

    void secondMeasureTimer_Tick(object sender, EventArgs e)
    {
#if DEBUG
        System.Diagnostics.Debugger.Log(0, "secondMeasure", "secondMeaserTimer ticked at " + DateTime.Now + Environment.NewLine); // Output every time the event is raised for debugging purposes
#endif

        elapsedTime++; // increas time every second

        if (level == "expert" && elapsedTime >= 10)
        {
            textBox1.Text = "10 seconds elapsed";
            secondMeasureTimer.Stop();
        }
        else if (elapsedTime >= 60)
        {
            textBox1.Text = "60 seconds elapse";
            secondMeasureTimer.Stop();
        }
    }

    private void timerButton_Click(object sender, EventArgs e)
    {
        if (secondMeasureTimer.Enabled)
        {
            secondMeasureTimer.Stop();
        }
        else
        {
            elapsedTime = 0;
            secondMeasureTimer.Start();
        }
    }
}

关于C# 定时器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440317/

相关文章:

c# - Entity Framework : The context is being used in Code First mode with code that was generated from an EDMX file

c# - 领域驱动设计 - 逻辑删除

c# - 动态编程由 64 个按钮 (8x8) 组成的网格

.net - Windows如何决定是触发MouseUp还是Click?

C# GC.Collect() 和内存

c# - TEXT 字段中的错误 (PostgreSQL) - NHibernate 无法读取它

c# - 从 Visual Studio 添加 Dll 到 Subversion

c# - Windows Azure 服务总线 - 一般问题

c# - 我的桌面应用程序在使用 async 和 await 调用 Web API 服务时挂起

c# - 如何在多线程中并行运行依赖任务?