2010-12-22 69 views
1

我希望它來執行代碼的第一部分,然後再進行圖片框可見,停頓3秒,隱藏的PictureBox並執行代碼的其餘部分:了Thread.Sleep(300)無法正常工作

// first part of the code here 
pb_elvisSherlock.Visible = true; 
Thread.Sleep(300); 
pb_elvisSherlock.Visible = false; 
// rest of the code here 

但它執行整個代碼塊,然後才暫停。任何想法該怎麼辦?

謝謝!

+1

不應認爲是`Thread.sleep代碼(3000);`?我相信`Thread.Sleep`的輸入以毫秒爲單位。 – Josh 2010-12-22 14:56:12

+0

發生了變化,但停頓時間更長,但我的照片箱仍未出現。 – Rob 2010-12-22 14:58:35

+2

你可能需要給你的照片一個繪畫的機會。在調用Thread.Sleep()之前,應該有一個Update()方法或類似的東西。由於這些原因,使用計時器可能會更好,所以其他一切都可以繼續工作。 – 2010-12-22 15:05:20

回答

5
pb_elvisSherlock.Visible = true; 
Application.DoEvents(); //let the app show the picturebox 
Thread.Sleep(3000); 
pb_elvisSherlock.Visible = false; 

問題在於,在暫停GUI線程之前,不要給消息循環顯示圖片框的機會。 Application.DoEvents()解決這個問題。

請注意,在GUI線程上使用Thread.Sleep會使繪畫凍結(嘗試在Sleep處於活動狀態時在應用程序上移動窗口)。

你應該做這樣的事情:

pb_elvisSherlock.Visible = true; 
int counter = 0; 
while (counter < 30) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(100); 
    ++counter; 
} 
pb_elvisSherlock.Visible = false; 

它仍然是一種黑客攻擊,但窗口將被重繪,因爲它應該作出迴應。

更新2

嘛。 DoEvents似乎有點扯皮。 (感謝您的評論)。

如果PictureBox的是一種嘮叨屏幕做這樣的事情:

替代1

  1. 創建一個只包含圖片框(不使用邊界的新形式在那個表格上)。
  2. 添加一個計時器,以這種形式調用Close三秒後
  3. 呼叫「myNagForm.DoModal()」

這種解決方案可以防止你的用戶在你的「正常」的形式做任何事情,而nagform是可見。

替代2

  1. 例如創建一個後臺工作,在這裏看到:http://dotnetperls.com/backgroundworker
  2. 移動你的圖片框和之後執行的後臺工作方法的代碼。
1

我會盡力使這個長:

Thread.Sleep(300); 

變化

Thread.Sleep(3000); 

你只是在你的榜樣(3000 = 3秒)暫停.3秒。如果我不得不猜測,你沒有足夠長的時間來顯示窗口。代碼實際上正常工作。

像評論一樣,嘗試在設置可見性屬性後添加Application.DoEvents();

1

你只沉睡了300毫秒首先不3秒

Thread.Sleep(3000); 

其次你的用戶界面將首先在你的代碼執行完畢,所以你需要做的是這樣this

0
更新

擴展是在這種情況下非常有用;-)

public static class IntExtensions 
{ 
    public static TimeSpan Seconds(this int value) 
    { 
     return new TimeSpan(0, 0, value); 
    } 
} 

Thread.Sleep(3.Seconds()); 
11

如果您試圖讓PictureBox出現3秒鐘,您可能希望您的應用程序在此期間保持響應。所以使用Thread.Sleep不是一個好主意,因爲你的GUI線程在睡眠時不處理消息。

更好的選擇是設置一個System.Windows.Forms.Timer 3000毫秒,在3秒鐘後隱藏PictureBox而不會阻塞您的GUI。

例如,像這樣:

pb.Visible = true; 
var timer = new Timer(); 
timer.Tick +=() => { pb.Visible = false; timer.Stop(); }; 
timer.Interval = 3000; 
timer.Start(); 
3

的問題是,你是阻塞UI線程,這是負責做你的形式重繪的線程,因此3秒內沒有獲取redrawen你正在等待(嘗試在這3秒鐘內拖動你的表格,你會發現它完全沒有響應)。

有是處理這個問題的方式加載,但基本前提是,首先你需要做在後臺線程你的等待讓你的UI線程保持響應(選項包括使用BackgroundWorker,一個Timer,該ThreadPoolThreadTPLTaskFactory)。其次,您必須記住,UI的任何更新都必須在UI線程上完成,因此您必須在最後隱藏圖片框之前切換回UI線程(使用.Invoke()TaskScheduler)。

此示例使用TPL(任務並行庫):

// Start by making it visible, this can be done on the UI thread. 
pb_elvisSherlock.Visible = true; 

// Now grab the task scheduler from the UI thread. 
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

// Now create a task that runs on a background thread to wait for 3 seconds. 
Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 

// Then, when this task is completed, we continue... 
}).ContinueWith((t) => 
{ 
    //... and hide your picture box. 
    pb_elvisSherlock.Visible = false; 

// By passing in the UI scheduler we got at the beginning, this hiding is done back on the UI thread. 
}, uiScheduler);