【问题标题】:How to open a form and then close it after X amount of seconds on c#?如何在 C# 上打开一个表单,然后在 X 秒后关闭它?
【发布时间】:2016-08-24 22:43:21
【问题描述】:

我需要在 C# 上打开一个表单,然后在 5 秒后自动关闭它。问题是,我需要从打开它的表单关闭表单,因为我打开的表单是有时从另一个窗体打开而不会自动关闭。

我试过了:

        private void button6_Click(object sender, EventArgs e)
    {
        GetNumber gtn = new GetNumber();
        gtn.Show();
        System.Threading.Thread.Sleep(6000);
        gtn.Hide();
        gtn = null;
    }

但是表单在开始时就搞砸了,当我尝试使用计时器时也发生了同样的情况。 有人知道如何解决我的问题吗?

【问题讨论】:

  • 您使用的是什么版本的 .Net,“表格被弄乱”是什么意思?

标签: c# forms time timer


【解决方案1】:

正如 itsme86 所说,计时器会为您尝试做的事情工作。如果您使用 .Net 4.5 或更高版本,则可以使用 async/await 功能。

就其核心而言,您需要释放 UI 线程以继续其工作。您的 Thread.Sleep 使 UI 线程无法使用。使用计时器或 async/await 允许 UI 线程启动您的对话框并处理任何用户操作。

private async void button6_Click(object sender, EventArgs e)
{
    GetNumber gtn = new GetNumber();
    gtn.Show();
    await Task.Delay(6000);
    gtn.Hide();
    gtn = null;
}

【讨论】:

  • 不行,我在VS 2008
  • 那我会选择 itsme86 的答案。
【解决方案2】:

计时器是正确的方法:

private void button6_Click(object sender, EventArgs e)
{
    GetNumber gtn = new GetNumber();
    gtn.Show();

    System.Timers.Timer timer = new Timer(6000);
    timer.Elapsed += (_, _2) => { Invoke((MethodInvoker)delegate { gtn.Close(); }); };
    timer.Start();
}

【讨论】:

  • 调用 Invoke 不应该是多余的吗?如果我没记错的话,定时器调用应该与主应用线程同步。
  • @IllidanS4 仅当您使用 System.Forms.Timer 时,我没有。但如果他们愿意,OP 可以走这条路。
  • 啊,抱歉,我没注意到。那么它应该是new System.Timers.Timer。 ☺ 而且看起来System.Timers.Timer 接受了一个SynchronizingObject,可以设置为当前表单,所以可以省略Invoke。
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
相关资源
最近更新 更多