我正在構建一個有5個總表單的程序。 1名MDIContainer和4名MDIChildren。如何睡覺沒有睡覺的孩子形式的父母或其他孩子形式
我目前有一個thread.sleep(1000)
爲每個MDIChild。執行操作時,我仍然需要其他3個MDIChild工作和交互。但是,現在調用thread.sleep(1000)
時,整個程序將休眠1秒鐘,並且在與其他任何表單交互之前,我必須等待睡眠完成。
有沒有辦法讓一個單一的形式睡覺?如果是這樣,請如何舉例。
我正在構建一個有5個總表單的程序。 1名MDIContainer和4名MDIChildren。如何睡覺沒有睡覺的孩子形式的父母或其他孩子形式
我目前有一個thread.sleep(1000)
爲每個MDIChild。執行操作時,我仍然需要其他3個MDIChild工作和交互。但是,現在調用thread.sleep(1000)
時,整個程序將休眠1秒鐘,並且在與其他任何表單交互之前,我必須等待睡眠完成。
有沒有辦法讓一個單一的形式睡覺?如果是這樣,請如何舉例。
你應該基本上永遠不會睡在用戶界面線程......永遠......正是你的問題所展示的原因。
你只是想在1秒內執行一些代碼。有兩種有效的方法:
1)您可以使用Timer
。通過在Forms
名稱空間中使用計時器,可以確保它在UI線程中觸發Tick
事件,並且不需要執行任何特殊的操作來與UI元素進行交互。
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Loading . . .";
var timer = new System.Windows.Forms.Timer();
timer.Interval = 1000;
timer.Tick += (s, args) =>
{
label1.Text = "Done!";
};
timer.Start();
}
正如你可以看到,這確實需要一個位更多的代碼比是理想的,但它仍然有效。
2)如果您有.NET 4.5和C#5.0,你可以使用任務與await
使這個真的光滑,易於:
private async void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Loading . . .";
await Task.Delay(1000); //wait 1 second, but don't block the UI thread.
label1.Text = "Done!";
}
我一直都很討厭定時器,但是你的例子很短,簡單而且很好。然而,瞭解等候/延遲是一個令人驚喜的驚喜。這個功能非常棒!簡單而簡單,謝謝。 – user1760784
請注意,第二個示例在底層將導致代碼看起來與第一個示例非常相似,只不過是讓編譯器和.NET庫爲您完成大部分工作。 – Servy
讓您的UI入睡讓人很沒有意義一般。將窗體的Enabled屬性設置爲false。使用一秒計時器將其設置回真。 –
thread.sleep(1000)用於延遲進程。在這個特定的程序中,它使一個圖片框更換圖片1秒鐘,然後改回來。我不希望這種形式在這1秒內相互影響,因此睡眠。 – user1760784