当某个函数被调用时,计时器停止

本文关键字:计时器 调用 函数 | 更新日期: 2023-09-27 18:10:04

我有richTextbox在我的应用程序,我想刷新它每一秒钟。当某个函数被调用时,定时器停止工作。

private void button1_Click(object sender, EventArgs e)
{
    //some selenium code to tests something 
}
public void timer1_Tick(object sender, EventArgs e)
{
    String Temp = richTextBox1.Text;
    richTextBox1.Text = Counter + Temp;
    Counter++;
}

:

  1. 运行应用
  2. richTextBox = 1…12…123年……1234
  3. 点击按钮(执行功能需要10秒)
  4. richTextBox = 1…13…123年……1234年……12345年……123456年……

是否有可能在第三步定时器将工作好?

当某个函数被调用时,计时器停止

窗体计时器通过窗口消息工作,并且WindowProc在主线程上执行,因此,如果Selenium代码锁定主线程,计时器将不会被触发。

UI也会被阻塞,使用Thread Timer和BeginInvoke并不能解决你的问题。

正如David所说,你可以创建一个BackgroundWorker,使用ThreadPool,或者更好的是,使用(如果Selenium有的话)异步API来避免锁定主线程。

你的问题是//some selenium code to tests something所代表的代码正在运行并阻塞UI线程,因此Timer(以及UI线程上没有其他运行的代码)可以运行直到它完成。

您需要在一个单独的线程上运行//some selenium code to tests something。查看一下BackgroundWorker的例子。

下面是一些示例代码,让您开始:

class BackgroundWorkerExample 
{
    private BackgroundWorker _backgroundWorker;
    public Program()
    {
        _backgroundWorker = new BackgroundWorker();
        _backgroundWorker.DoWork += BackgroundWorker_DoWork;
        _backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _backgroundWorker.RunWorkerAsync();
    }
    private static void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //some selenium code to tests something 
    }
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //Whatever you want to do when the tests complete
    }
}

还有其他选项,如Thread, ThreadPool, TaskFactory等。然而,既然你已经在使用,并且对Windows窗体有点熟悉,那么BackgroundWorker可能是你最简单的选择。