调用某些函数时,计时器停止

时间:2015-08-27 17:55:53

标签: c# timer

我的应用程序上有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 ......
  5. 是否有可能在第3步计时器也能正常工作?

2 个答案:

答案 0 :(得分:0)

表单计时器通过Window消息工作,并且WindowProc在主线程上执行,因此,如果Selenium代码锁定主程序,则不会触发计时器。

此外,UI将被阻止,使用线程计时器和BeginInvoke将无法解决您的情况。

正如David所说,您可以创建一个BackgroundWorker,使用ThreadPool甚至更好,使用(如果Selenium拥有它)一个异步API来避免锁定主线程。

答案 1 :(得分:0)

您的问题是//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
    }
}

还有其他选项,例如ThreadThreadPoolTaskFactory等。但是,由于您已经使用并且有点熟悉,因此Windows {{1}对你来说,这可能是最简单的选择。

相关问题