C#中的延迟功能

Fah*_*m S 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待文本框的背景颜色会交替变换10次,但在循环结束后我只能看到黄色.如果我增加延迟,我会注意到程序需要时间才能完成.我浏览了一些相关的文章,但无法理解.任何帮助将不胜感激.谢谢

Alu*_*dad 8

使用异步方法使用内置方法创建延迟Task.Delay。这将导致执行暂停,然后在指定时间后继续执行, 而不会阻塞当前线程。

async Task UseDelay()
{
    await Task.Delay(1000); // wait for 1 second
}
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下

async void button1_Click(object sender, EventArgs e)
{ 
    for (var i = 0; i < 10; i++) 
    {
        textBox1.BackColor = Color.Red;         
        await Task.Delay(100);
        textBox1.BackColor = Color.Yellow;    
        await Task.Delay(100);
    }
 }
Run Code Online (Sandbox Code Playgroud)


小智 5

问题不在于延迟,而在于UI应用程序的线程模型.在UI应用程序中,任何事件处理程序都发生在"UI线程"上.当该代码正在运行时,UI基本上被冻结,因此您无需做任何事情.

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

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

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