2011-09-01 40 views
2

我有一個需要在for循環中嵌入背景睡眠的情況。 有沒有什麼辦法可以做到這一點沒有突破for循環的形狀?在Silverlight中,如何在不佔用線程的情況下讓程序休眠

for (;;) 
{ 
    Dosomething(); 
    Thread.Sleep(5000); // this blocks the UI thread, hope to find someway to sleep in background 
} 

-------------編輯--------------

在DoSomething的()

,有一定的UI線程操作像listBoxA.width + = 5(不含調度程序); 這裏的UI不會刷新,直到所有的循環結束。 我想使用睡眠的原因是我想看看每個Dosomething被執行的UI刷新,就像動畫一樣。

+1

你應該更多地解釋你想達到什麼 - 你在做輪詢或消息循環嗎?您可以在後臺線程上運行整個循環,但在前臺(UI)線程中沒有任何背景睡眠的目的或邏輯。 – slugster

+0

看到這個主題:http://stackoverflow.com/questions/2307929/what-is-the-c-equivalent-of-msgwaitformultipleobjects –

回答

2

您沒有爲你需要什麼你的代碼提供了很多信息,所以我給它這是一個嘗試:在Silverlight

 int counter = 4; 
     DispatcherTimer _timer = new DispatcherTimer(); 
     _timer.Interval = TimeSpan.FromSeconds(5); 
     _timer.Tick += (s, e) => 
     { 
      DoSomething(); 

      counter--; 

      if (counter == 0) _timer.Stop(); 

     }; 
     _timer.Start(); 
+0

+1雖然因爲問題中的循環是無限的,我不會在這裏包括計數器會使這個代碼示例更簡單。 – AnthonyWJones

+0

我想展示如何在需要時停止代碼。 – Rumplin

+0

@Rumplin,因爲我在我的線程上編輯,實際上我正在嘗試在Dosomething()中執行一些UI操作,並使用for循環來實現動畫效果。無論如何,我設法做到這一點使用時間報價器。 – demaxSH

0

一切都應該被設計成異步運行。你的例子根本不是在Silverlight中運行常規後臺任務的方式(這可能是你想要的DoSomething())。

嘗試閱讀BackgroundWorker以在另一個線程上運行您的任務,然後運行DispatchTimer以運行常規任務(如Rumplin在其示例中所建議的)。

相關問題