在不必延迟主线程的情况下延迟函数内部的最简单/最简单的方法是什么?
我正在尝试做的就是这样:
private void FallingToggle(bool a)
{
a = true;
Thread.Sleep(1000);
a = false;
}
但我发现它冻结了整个程序。
有没有解决的办法?或者有更简单的方法来解决这个问题吗?
答案 0 :(得分:6)
回应您的评论,您可以通过多种方式实现您的目标。
一种方法是记录第一次动作发生的时间(这可以使用DateTime.Now
来实现)。然后,如果在记录时间的一秒内发生任何后续动作,则立即返回。例如:
DateTime lastActionTime = DateTime.Now;
// ...
if ((DateTime.Now - lastActionTime).Milliseconds < 1000)
{
// Too soon to execute the action again
return;
}
// Do whatever the action does...
另一种方法是,如果要禁用按钮一秒钟,则使用Timer
(.NET Framework中有几个计时器,我使用的是Winforms版本这里)。一旦操作发生,您将禁用按钮或其他UI元素,然后启动Timer
,间隔为一秒。一旦计时器关闭,您可以重新启用UI元素,允许用户再次执行操作。例如:
// In a constructor or something
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000; // 1000 milliseconds
timer.Tick += (s, e) =>
{
button.Enabled = true;
timer.Stop();
};
// ...
void OnButtonClick()
{
button.Enable = false;
timer.Start();
// Do whatever the button does...
}
后者是您在GUI中使用的,前者可以用于游戏等。
答案 1 :(得分:0)
这是方式..
在a = true;
启动新线程后的函数调用事件中。并把
Thread.Sleep(1000);
a = false;
在新主题中。
我认为这是最简单的方法。