2012-06-15 53 views
1

什麼是最簡單或最簡單的方式來延遲函數內部而不必延遲主線程?
這就是我想要做的是與此類似:最簡單的延遲方法

private void FallingToggle(bool a) 
    { 
     a = true; 
     Thread.Sleep(1000); 
     a = false; 
    } 

但我發現它凍結了整個程序。
有沒有辦法解決這個問題?還是有更簡單的方法來解決這個問題?

+2

此代碼暗示您的項目存在嚴重的設計缺陷,您應該重新考慮需要隨意休眠1000次。您想要做什麼? – Arafangion

+1

這確實是延遲的「最簡單」方法(並且只有一般方法才能同步延遲*)。但是,正如所見,那*會阻止當前線程。否則,請考慮移至* asynchronous *模型(例如Timer和回調)。 – 2012-06-15 03:29:33

+0

你能解釋一下你爲什麼要這麼拖延嗎?它聞起來很腥。 – JohnFx

回答

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元素,然後以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中使用的,前者可用於類似遊戲的東西。

0

這裏的方式..

在函數調用事件a = true;後啓動一個新的線程。並把

Thread.Sleep(1000); 
    a = false; 

在新的線程。

我覺得這是最簡單的方法。

+0

不應該使用thread.sleep。定時器選項和'mgbowen'在答案中提供的禁用按鈕選項是更好的設計。 –