什麼是最簡單或最簡單的方式來延遲函數內部而不必延遲主線程?
這就是我想要做的是與此類似:最簡單的延遲方法
private void FallingToggle(bool a)
{
a = true;
Thread.Sleep(1000);
a = false;
}
但我發現它凍結了整個程序。
有沒有辦法解決這個問題?還是有更簡單的方法來解決這個問題?
什麼是最簡單或最簡單的方式來延遲函數內部而不必延遲主線程?
這就是我想要做的是與此類似:最簡單的延遲方法
private void FallingToggle(bool a)
{
a = true;
Thread.Sleep(1000);
a = false;
}
但我發現它凍結了整個程序。
有沒有辦法解決這個問題?還是有更簡單的方法來解決這個問題?
迴應你的評論,有很多方法可以實現你想要做的。
一種方法是記錄第一次動作發生的時間(這可以使用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元素,然後以1秒的間隔啓動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中使用的,前者可用於類似遊戲的東西。
這裏的方式..
在函數調用事件a = true;
後啓動一個新的線程。並把
Thread.Sleep(1000);
a = false;
在新的線程。
我覺得這是最簡單的方法。
不應該使用thread.sleep。定時器選項和'mgbowen'在答案中提供的禁用按鈕選項是更好的設計。 –
此代碼暗示您的項目存在嚴重的設計缺陷,您應該重新考慮需要隨意休眠1000次。您想要做什麼? – Arafangion
這確實是延遲的「最簡單」方法(並且只有一般方法才能同步延遲*)。但是,正如所見,那*會阻止當前線程。否則,請考慮移至* asynchronous *模型(例如Timer和回調)。 – 2012-06-15 03:29:33
你能解釋一下你爲什麼要這麼拖延嗎?它聞起來很腥。 – JohnFx