计时器停止并跳转到某一秒

时间:2017-09-11 10:04:03

标签: c#

我制作了一个示例项目。每隔10秒就有一些功能。但是当我试图在标签中显示计时器时,它总是卡住,然后跳到某个秒(eg: stuck at 9s and suddenly jump to 12s)。我想问的是,

  1. 我的功能是否正常运行?
  2. 我的嘀嗒声,跳过几毫秒? (它将与我的功能重叠)
  3. 如何以线程形式运行它?
  4. 我的代码

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

    如何保持我的label1.text不断更新,同时执行addpoint()函数

    注意:

    我已设置timer1 interval = 1000

    更新

    我用它来测试它。

    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 !");
        }
    

1 个答案:

答案 0 :(得分:1)

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

您可以验证它是否正在用SUM替换driver.manage().window().maximize(); 的来电,您将会遇到相同的行为。

你可以做的是尝试在另一个线程上运行该方法:

     WebElement element = Wait.wait.until(visibilityOfElementLocated(By.cssSelector(".logo-large")));
    element.sendKeys(Keys.CONTROL , Keys.COMMAND , "f");
    element.sendKeys(Keys.CONTROL , Keys.COMMAND , "F");
    Actions action = new Actions(driver);
    action.keyDown(Keys.CONTROL).keyDown(Keys.COMMAND).sendKeys("F").perform();
    action.keyDown(Keys.CONTROL).keyDown(Keys.COMMAND).sendKeys("f").perform();

这应该避免阻止GUI。

声明:

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