2017-09-08 142 views
2

我需要了解如何在一組命令之間創建延遲。我的背景是與C(DOS),現在恢復使用C#在Visual Studio 2015年這個概念是我掙扎代碼:C#中的延遲函數

using System.Threading; 

private void button1_Click(object sender, EventArgs e)  // Button 
{ 
    int i; 
    for (i = 0; i < 10; i++) 
    { 
     textBox1.BackColor = Color.Red; 
     Thread.Sleep(100); 
     textBox1.BackColor = Color.Yellow; 
     Thread.Sleep(100); 
    } 
} 

我期待文本框的背景顏色會改變或者10倍但循環結束後我只能看到黃色。如果我增加延遲,我注意到程序需要時間才能完成。我瀏覽了一些相關的文章,但無法理解。任何幫助將不勝感激。謝謝

+3

WinForms是單線程的,你對'Thread.Sleep'的調用會阻塞該線程。你必須避免阻塞UI線程。文本框只會在控件產生到代碼中從不發生的WM_PAINT窗口消息處理程序時纔會改變顏色。 – Dai

+1

看看[這篇文章](http://stackoverflow.com/editing-help)爲了學習如何使用代碼塊。 –

回答

3

使用異步方法使用內置的Task.Delay方法創建延遲。這會導致執行暫停,然後在指定的時間而不是阻止當前線程後繼續執行。

async Task UseDelay() 
{ 
    await Task.Delay(1000); // wait for 1 second 
} 

在您的具體情況

button1_Click(object sender, EventArgs e) // Button 
{ 
    for (var i = 0; i < 10; i++) 
    { 
     textBox1.BackColor = Color.Red;   
     await Task.Delay(100); 
     textBox1.BackColor = Color.Yellow;  
     await Task.Delay(100); 
    } 
} 
+1

我使用了這段代碼並得到了期望的結果。我也能夠應用這一理念,以期望的間隔輪詢操縱桿。感謝Aluan爲修改後的代碼和乍得的概念, –

4

的問題是不是與延遲,它與UI應用程序的線程模型。在UI應用程序中,任何事件處理程序都發生在「UI線程」上。在該代碼正在運行時,用戶界面基本上被凍結,所以你在那裏沒有任何問題。

這意味着如果您在那裏「睡眠」,整個應用程序將鎖定並且無響應,直到它返回。

但是,如果他們需要做長時間運行的工作,你可以讓你的事件處理程序「異步無效」而不是「無效」。那麼如果你await Task.Delay(someTime)而不是Thread.Sleep(someTime),它會在發生這種情況時釋放UI線程。而且你應該看到你沒有UI鎖定的期望。

此外,該時間以毫秒爲單位,即等待「十分之一秒」。這真的很快。你可能想慢一點來得到你想要的效果。