我的应用程序上有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++;
}
流量:
是否有可能在第3步计时器也能正常工作?
答案 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
}
}
还有其他选项,例如Thread
,ThreadPool
,TaskFactory
等。但是,由于您已经使用并且有点熟悉,因此Windows {{1}对你来说,这可能是最简单的选择。