当某个函数被调用时,计时器停止
本文关键字:计时器 调用 函数 | 更新日期: 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++;
}
:
- 运行应用
- richTextBox = 1…12…123年……1234
- 点击按钮(执行功能需要10秒)
- 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
可能是你最简单的选择。