我想要实现一个简单的应用程序,在特定和精确的时间内,使用webbrowser控件,转到网页。
public partial class Form1 : Form
{
System.DateTime timeStart = new System.DateTime(2016, 05, 25, 19, 30, 00, 00);
TimeSpan sub;
bool timeExpires = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 100;
timer1.Start();
while(timeExpires)
{
webBrowser1.Navigate("https://www.google.it/");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
System.DateTime Now = System.DateTime.Now;
sub = timeStart.Subtract(Now);
if ((int)sub.TotalSeconds == 0)
{
this.timer1.Stop();
MessageBox.Show("ok, Time is up!");
timeExpires = true;
}
else
{
textBox1.Text = sub.ToString();
}
}
}
在timecount之后,当设置了timer1.stop()时,将显示消息框。
但是webbrowser不会运行。
我知道我使用bool变量timeExpires是一个"过时的" 方法。
我有两个问题:
非常感谢
答案 0 :(得分:1)
您的主要线程被while循环阻止,因此消息/事件不会被处理。这样,timeExpires
的值永远不会在循环内发生变化。如您所知,您可以Application.DoEvents()
强制处理事件,但除非您确实understand how this works
以及它可能是多么邪恶,否则它可能不会很好。
你应该在Timer的Tick事件中打开浏览器(就像你正在调用MessageBox.Show()
的地方一样),但是如果你的陈述需要更多的话,请谨慎地在tick事件上做太多事情运行时间超过了计时器的间隔,Tick事件将再次运行并可能搞乱一切。因此,要解决此问题,无论您在Tick事件中输入什么内容,请暂停计时器并在您完成的任务中重新开始。
private void timer1_Tick(object sender, EventArgs e) {
timer1.Stop(); // prevent event to fire again, until we get some stuff done
if(timeStart >= DateTime.Now) {
openBrowser();
} else {
timer1.Start();
textBox1.Text = sub.ToString();
}
}