C# 计时器停止并跳到某一秒

C# 计时器停止并跳到某一秒,c#,C#,我做了一个样本项目。每10秒它就会做一些功能。但当我试图在标签上显示计时器刻度时,它总是卡住,并跳到某一秒(例如:在9秒时卡住,然后突然跳到12秒)。我想问的是 我的功能运行正常吗 是我的滴答声,跳过了几毫秒?(它将与我的功能重叠) 如何将其作为线程运行 我的代码 private void button2_Click(object sender, EventArgs e) { timer1.Start(); } int x

我做了一个样本项目。每10秒它就会做一些功能。但当我试图在标签上显示计时器刻度时,它总是卡住,并跳到某一秒
(例如:在9秒时卡住,然后突然跳到12秒)
。我想问的是

  • 我的功能运行正常吗
  • 是我的滴答声,跳过了几毫秒?(它将与我的功能重叠)
  • 如何将其作为线程运行
  • 我的代码

       private void button2_Click(object sender, EventArgs e)
        {            
            timer1.Start();
        }
    
        int x = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            x += 1;
            label1.Text = x.ToString();
            if (x % 10 == 0)
            {
                addpoint();
                //MessageBox.Show("success");
            }
    
        }
    
    如何在执行addpoint()函数时保持我的label1.text不断更新

    注意:

    我已设置
    timer1 interval=1000

    更新

       private void button2_Click(object sender, EventArgs e)
        {            
            timer1.Start();
        }
    
        int x = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            x += 1;
            label1.Text = x.ToString();
            if (x % 10 == 0)
            {
                addpoint();
                //MessageBox.Show("success");
            }
    
        }
    
    我用这个测试它

    public void addpoint()
        {
            string x = @"c:\test\a.txt";
            string text = "haiaiaia";
            using (FileStream fs = new FileStream(x, FileMode.Create))
            {
                Byte[] xx = Encoding.ASCII.GetBytes(text);
                fs.Write(xx, 0, xx.Length);
            }
            Messagebox.show("Created !");
        }
    

    看起来您使用的是在主线程上执行的Windows.Forms.Timer。优点是您不需要调用Invoke,缺点是addpoint也在主线程上执行,因此在触发下一个tick事件的同时会阻止GUI的更新

    您可以验证它是否将
    addpoint
    的调用替换为
    Thread.Sleep(3000)
    ,您将体验到相同的行为

    您可以尝试在另一个线程上运行该方法:

    private void timer1_Tick(object sender, EventArgs e)
    {
        x += 1;
        label1.Text = x.ToString();
        if (x % 10 == 0)
        {
             Thread t = new Thread(addpoint); 
             t.Start();
        }
    }
    
    这应该可以避免GUI的阻塞

    免责声明:


    了解您在
    addpoint
    中的实际操作非常重要,因为此解决方案可能会导致竞争条件和方法的错误运行。例如,如果您在其中使用类变量,并且存在第二个线程可以在第一个线程尚未完成时启动的可能性!注意

    你需要多长时间才能点击掉messagebox?什么样的计时器?所示代码(messagebox被注释掉)是否存在问题,或者仅当messagebox存在时才存在问题?您的程序是否在计时器上或在响应单击时执行其他可能阻止计时器运行的操作?此计时器内是否需要
    label1.Text
    更新?如果没有,为什么不将计时器间隔设置为
    10000
    ?@LasseV.Karlsen对不起,我忘了删除messagebox注释。好的,问题是每当我做函数
    addpoint
    我的label1.text就跳到12w什么是
    addpoint
    做的,函数需要多长时间才能完成?如果他只是用async关键字more physible创建函数呢@扎伊努拉比丁是的,他可以。物理是什么意思?对不起。我试图在
    addpoint
    函数的末尾放置一些消息框。但它并没有出现。我认为它没有运行功能是的,实际上它是可行的。我的拼写错误@我测试了我的代码,应该可以用了。那么你的标签还有问题吗?