C#

时间:2017-09-08 01:20:34

标签: c# timer

我需要了解如何在一组命令之间创建延迟。我的背景是C(DOS),现在在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次,但是在循环结束后我只能看到黄色。如果我增加延迟,我会注意到程序需要时间才能完成。我浏览了一些相关的文章,但无法理解。任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:5)

问题不在于延迟,而在于UI应用程序的线程模型。在UI应用程序中,任何事件处理程序都发生在“UI线程”上。当该代码正在运行时,UI基本上被冻结,所以你没有做任何事情。

这意味着如果你在那里“睡觉”,整个应用程序将锁定并且无响应,直到它返回。

但是如果他们需要做长时间的工作,你可以使你的事件处理程序“异步无效”而不仅仅是“无效”。然后,如果您await Task.Delay(someTime)而不是Thread.Sleep(someTime),它将在发生这种情况时释放UI线程。如果没有UI锁定,你应该看到你的期望。

此外,该时间以毫秒为单位,即等待“十分之一秒”。这真的非常非常快。您可能希望将其减慢一点以获得所需的效果。

答案 1 :(得分: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);
    }
 }