2017-09-08 174 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锁定的期望。

此外,该时间以毫秒为单位,即等待“十分之一秒”。这真的很快。你可能想慢一点来得到你想要的效果。