倒计时结束后运行webbrowser控件(带定时器)

时间:2016-05-25 16:56:55

标签: c# multithreading thread-safety controls webbrowser-control

我想要实现一个简单的应用程序,在特定和精确的时间内,使用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是一个"过时的" 方法。

我有两个问题:

  • 哪里是最好的实践或最好的方式来通知"在webbrowser或倒计时结束的任何其他事情,现在是时候运行了。
  • 这个approch(布尔变量)的问题在哪里?即使不是最好的方法,我怎么能用这个approch运行?

非常感谢

1 个答案:

答案 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();
           }
 }