2012-12-07 32 views
0

我正在構建一個有5個總表單的程序。 1名MDIContainer和4名MDIChildren。如何睡覺沒有睡覺的孩子形式的父母或其他孩子形式

我目前有一個thread.sleep(1000)爲每個MDIChild。執行操作時,我仍然需要其他3個MDIChild工作和交互。但是,現在調用thread.sleep(1000)時,整個程序將休眠1秒鐘,並且在與其他任何表單交互之前,我必須等待睡眠完成。

有沒有辦法讓一個單一的形式睡覺?如果是這樣,請如何舉例。

+2

讓您的UI入睡讓人很沒有意義一般。將窗體的Enabled屬性設置爲false。使用一秒計時器將其設置回真。 –

+0

thread.sleep(1000)用於延遲進程。在這個特定的程序中,它使一個圖片框更換圖片1秒鐘,然後改回來。我不希望這種形式在這1秒內相互影響,因此睡眠。 – user1760784

回答

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!"; 
} 
+0

我一直都很討厭定時器,但是你的例子很短,簡單而且很好。然而,瞭解等候/延遲是一個令人驚喜的驚喜。這個功能非常棒!簡單而簡單,謝謝。 – user1760784

+0

請注意,第二個示例在底層將導致代碼看起來與第一個示例非常相似,只不過是讓編譯器和.NET庫爲您完成大部分工作。 – Servy