【问题标题】:Timer stops when some function is called调用某些函数时计时器停止
【发布时间】:2015-11-22 05:54:20
【问题描述】:

我的应用程序中有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...

是否有可能在第 3 步期间计时器也可以工作?

【问题讨论】:

  • BackgroundWorker 将成为 selenium 代码块的朋友。
  • 如果操作阻塞了 UI 线程,那么在此期间将无法更新富文本框(或任何其他 UI 元素)。查看线程、后台工作人员、async 等。

标签: c# timer


【解决方案1】:

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

UI 也会被阻塞,使用线程计时器和 BeginInvoke 也无法解决您的问题。

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

【讨论】:

    【解决方案2】:

    您的问题是 //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 窗体并且对它有些熟悉,BackgroundWorker 可能是最简单的选择你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多