如何在c#中有效使用计时器

时间:2012-08-19 17:29:56

标签: c#

我必须显示一个表单大约5秒然后我必须关闭该表单,然后在显示计时器必须停止的新表单后显示其他表单。

我很难做到这一点。

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    Form5 f5 = new Form5();
    f5.Show();
    f5.label7.Text = label6.Text;

    MyTimer.Interval = 5000; // 0.5 mins
    MyTimer.Tick += new EventHandler(MyTimer_Tick);
    MyTimer.Start();
}

private void MyTimer_Tick(object sender, EventArgs e)
{
    MessageBox.Show("All The Best for Your Test and Your Time Starts Now.");
    Form6 f6 = new Form6();
    f6.Show();
    MyTimer.Enabled = false;

    Form5 f5 = new Form5();
    f5.Hide();
}

5 个答案:

答案 0 :(得分:1)

试试这段代码

 Form5 f5 = new Form5();
 private void radioButton1_CheckedChanged(object sender, EventArgs e)
 {
    f5.Show();
    f5.label7.Text = label6.Text;

    MyTimer.Interval = 5000; // 0.5 mins
    MyTimer.Tick += new EventHandler(MyTimer_Tick);
    MyTimer.Start();
  }

  private void MyTimer_Tick(object sender, EventArgs e)
  {
    MessageBox.Show("All The Best for Your Test and Your Time Starts Now.");
    Form6 f6 = new Form6();
    f6.Show();
    MyTimer.Enabled = false;
    MyTimer.stop();        

    f5.Hide();
  }

答案 1 :(得分:0)

在函数之外拉出Form5的声明,因此它是一个字段。就目前而言,每个函数都有一个不同的这个类的实例。

Form5 f5 = new Form5();

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    f5.Show();
    f5.label7.Text = label6.Text;

    MyTimer.Interval = 5000; // 0.5 mins
    MyTimer.Tick += new EventHandler(MyTimer_Tick);
    MyTimer.Start();
}

private void MyTimer_Tick(object sender, EventArgs e)
{
    MessageBox.Show("All The Best for Your Test and Your Time Starts Now.");
    Form6 f6 = new Form6();
    f6.Show();
    MyTimer.Enabled = false;
    MyTimer.Stop();

    f5.Hide();
}

注意:你真的应该重命名你的表单类和变量 - f6是没有意义的。称之为它。

答案 2 :(得分:0)

试试这个

    Form5 f5 = new Form5();  //declare form obj globally 

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{

    f5.Show();
    f5.label7.Text = label6.Text;

    MyTimer.Interval = 5000; // 0.5 mins
    MyTimer.Tick += new EventHandler(MyTimer_Tick);
    MyTimer.Start();
}

private void MyTimer_Tick(object sender, EventArgs e)
{
    MessageBox.Show("All The Best for Your Test and Your Time Starts Now.");
    Form6 f6 = new Form6();
    f6.Show();
    MyTimer.Enabled = false;


    f5.Hide();
}

答案 3 :(得分:0)

我看到几个潜在的问题。首先,您应该只设置一次计时器,也许在表单构建时,您不需要设置间隔,并且每次radioButton1的检查状态更改时都会连接一个偶数处理程序。

在MyTimer_Tick内部,第一个行应该调用MyTimer.Stop()(只需调用stop,你不需要乱用Enabled,他们做同样的事情)。

那么你可以显示MessageBox(它是模态和阻塞),显示Form6,隐藏f5等。

将MessageBox.Show()视为一个非常长时间运行的调用。在消息框被解除之前它不会返回(它可能很容易占用超过5秒或任意时间)。当MessageBox启动时,计时器滴答事件仍在排队(因为停止计时器的行尚未执行)。值得查看MessageBox.Show()的文档并阅读有关模态对话框的内容以及它与替代方法的不同之处。

尝试清理其他人指出的名字。

答案 4 :(得分:0)

我认为你很难实现。如果我理解你的话......

只需向form5添加一个计时器,设置它的属性Enabled = true;Interavl = 1000;(1000毫秒或1秒)。只需将计时器刻度事件处理程序添加到您的form5计时器,如

private int _start = 0;
private int _seconds = 5;

private void timer1_Tick(object sender, EventArgs e)
{
        _start++;
        if(_start >= _seconds)
        {
             Close();
        }
}

_start_seconds应该像表单类私有字段或事件处理程序之前的属性一样初始化。这段代码对我来说很好,并且在显示5秒后它关闭了form5。如果你想让它更灵活,例如,如果你想设置form5应显示多少秒,你可以,例如,重新加载form5构造函数,如...

public Form5(int seconds)
{
       InitializeComponent();
       _seconds = seconds;
}

并在form1中,当您创建form5传递秒数时,您希望将form5显示为参数:

Form5 f5 = new Form5(5);

我认为最好在事件处理程序

中直接创建表单5的新实例
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{

    new Form5(10).Show(); // show form5 for 10 seconds
    ...
}

如果你想在form5关闭后再显示另一个表单,只需在show5事件处理程序中关闭form5之前显示它:

private void timer1_Tick(object sender, EventArgs e)
    {
            _start++;
            if(_start >= _seconds)
            {
                 new Form2().Show();
                 Close();
            }
    }