2015-07-10 112 views
2

System.Threading.Thread.Sleep適用於停止時間的應用程序,但它不起作用,因爲我需要。如何在沒有System.Threading.Thread.Sleep的情況下停止程序。 C#?

這是我的代碼:

buttonShip.Enabled = false; 
Saving(); 
SetProperties(); 
Loading(); 
ShowLabels(); 
System.Threading.Thread.Sleep(3000); 
buttonShip.Enabled = true; 

我可以先點擊後立即點擊buttonShip。當程序顯示該按鈕是已禁用時,其實際上已啓用

我的問題是,我如何停止程序3秒?

+0

或者我如何禁用按鈕3秒 – Roman

+0

爲什麼你使用'系統。Threading.Thread.Sleep(3000);'爲什麼你想禁用按鈕只有3秒? –

+0

此代碼是否在'async'線程下運行? –

回答

0

沒有a good, minimal, complete code example明確說明你的情況,很難確切知道你想要做什麼。

但是,在我看來,您真正想要的是在UI線程中執行工作。這將允許用戶可以看到按鈕的Enabled狀態的變化,並且允許其餘的UI在工作發生時保持響應。

一個基本的方法來完成,這將是改變你的代碼,以便它看起來更像是這樣的:

async void buttonShip_Click(object sender, EventArgs e) 
{ 
    buttonShip.Enabled = false; 
    await Task.Run(() => 
    { 
     Saving(); 
     SetProperties(); 
     Loading(); 
     ShowLabels(); 
    } 

    // Wait for three more seconds before re-enabling the button: 
    await Task.Delay(3000); 

    buttonShip.Enabled = true; 
} 

這將導致所有的其他代碼在從UI線程不同的線程中執行。當任務開始時,buttonShip_Click()方法將實際返回而不執行最後一條語句。任務中的語句將在不同的線程中執行。當任務完成後,控制將返回到buttonShip.Click()方法;它將開始在語句await之後的語句處執行,即重新啓用按鈕的語句。

不幸的是,你原來的代碼示例非常含糊。任務中的至少一些工作有可能還應該更新UI。如果是這種情況,那麼有辦法做到這一點,包括簡單地使用Control.Invoke()在它所屬的UI線程上執行與UI相關的代碼,或者使用Progress<T>類完成相同的操作,但通過IProgress<T>接口。

如果您需要更多的建議,我建議您嘗試以上方法,研究可能出現的其他問題(如果有的話),如果您無法解決問題,請發佈有關這些新問題的新問題,一定要包括一個很好的代碼示例。


編輯:

每您的評論以上,這裏列出:

該程序可爲100毫秒內執行,在這種情況下,該按鈕必須在3秒內被激活100毫秒。如果程序執行5秒,在這種情況下,該按鈕必須在8秒後激活

我瞭解,無論執行其他任務需要多長時間,您都希望按鈕不被重新啓用直到3秒後。我已經更新了上面的代碼示例來完成此操作。

相關問題