C# 为什么睡眠会堆积起来?

C# 为什么睡眠会堆积起来?,c#,C#,我有一个按钮,可以启动计时器一个滴答声。我想隐藏表单,将表单暂停5.5秒,然后再次显示。 我注意到,如果我在启动应用程序线程后第一次按下按钮,睡眠时间为5.5秒,但如果我再次按下按钮,睡眠时间为11秒。在我第三次按下它后,它会休眠16秒,以此类推 这对我来说真的很奇怪,我不知道为什么会这样。 有人有主意吗 注意:线程。我的应用程序非常需要睡眠 使用系统线程; 私有无效Btn\u Abwesend\u单击(对象发送者,事件参数e) { timer.Tick+=计时器1\u Tick\

我有一个按钮,可以启动计时器一个滴答声。我想隐藏表单,将表单暂停5.5秒,然后再次显示。 我注意到,如果我在启动应用程序线程后第一次按下按钮,睡眠时间为5.5秒,但如果我再次按下按钮,睡眠时间为11秒。在我第三次按下它后,它会休眠16秒,以此类推

这对我来说真的很奇怪,我不知道为什么会这样。 有人有主意吗

注意:线程。我的应用程序非常需要睡眠

使用系统线程;
私有无效Btn\u Abwesend\u单击(对象发送者,事件参数e)
{       
timer.Tick+=计时器1\u Tick\u 1;
计时器。间隔=100;
timer.Start();
}
私有无效计时器1_Tick_1(对象发送方,事件参数e)
{
this.Hide();
睡眠(5500);
this.Show();
timer.Stop();
}

是代理订阅堆积在一起,即

timer.Tick+=timer1\u Tick\u 1;

每次这样做时,它都会添加一个处理程序。每次添加相同的目标实例/方法并不重要:它将被多次调用。基本上只做一次

您不会在任何地方取消订阅
Timer.Tick
event,因此每次在此行中添加额外的处理程序时都要按下按钮
Timer.Tick+=timer1\u Tick\u 1。您应该使用
timer.Tick-=timer1\u Tick\u 1在代码中的某个地方

每次单击按钮,都会添加一个新的勾号处理程序。第一次有一个,所以你要等5.5秒。第二次有两个,所以增加了一倍,以此类推。将click事件的第一行移到外部(很可能移到表单的构造函数中)有点像切线,但是:不要调用
Thread.Sleep
。永远(“几乎永远”)。这不是挂起UI的正确方法。勾选事件订阅属于构造函数,因此只能执行一次。将其放在InitializeComponent()调用之后。或者只需在窗体上放置一个带有设计器的计时器,这样它就完全是automagic的,也可以确保计时器停止并释放。