2011-11-10 66 views
1

我一直在使用WPF和線程。wpf中的睡眠內循環

我想在for循環中暫停整個屏幕(僅適用於應用程序)。

E.g.

foreach (classA a in classesA) 
{ 
.... 
.... 
Thread.sleep(100); 

} 

但是,我發現它會睡得很久,然後在一段時間內執行所有語句。 這不是我想要的。我想在for循環的執行過程中睡覺。那是第一次循環後睡100毫秒,然後再次睡第二次循環後.....

我發現一些文章提到DoEvents(),但我不是很熟悉它,WPF似乎沒有這種事情。

其他一些文章提到DispatcherTimer。不過,它不會鎖定屏幕。 我想鎖定整個屏幕(僅適用於應用程序),以防止在執行for循環期間點擊任何按鈕。

我該怎麼做?

非常感謝!

回答

0

如果您願意嘗試使用建議的asyncawait關鍵字,則可以使用這種同步語義實現睡眠行爲。你需要安裝Async CTP來做到這一點。

public aysnc void YourButton_Click(object sender, EventArgs args) 
{ 
    foreach (classA a in classes) 
    { 
    await Task.Delay(100); 
    } 
} 

的異步CTP使用TaskEx代替Task

4

您不能阻止UI線程,否則無法處理其隊列,其中包含渲染UI,如果您想阻止與根元素上的UI元素集IsEnabled=false的交互,然後執行非阻塞等待見this question

+0

我試圖讓頁面IsEnabled = false。然而,它把我的一些控制從黑色變成了白色,非常醜陋!如何解決它? – user883434

+0

@ user883434:你必須修改模板,如果它們是黑色的,開始時某人沒有正確地設置它們被禁用時的狀態... –

+0

另一種方法是如果你不設置IsHitTestVisible爲False就像禁用的控件的外觀一樣。這使元素無視點擊。 – Aphex