沒有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秒後。我已經更新了上面的代碼示例來完成此操作。
或者我如何禁用按鈕3秒 – Roman
爲什麼你使用'系統。Threading.Thread.Sleep(3000);'爲什麼你想禁用按鈕只有3秒? –
此代碼是否在'async'線程下運行? –