我需要了解如何在一组命令之间创建延迟.我的背景是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次,但在循环结束后我只能看到黄色.如果我增加延迟,我会注意到程序需要时间才能完成.我浏览了一些相关的文章,但无法理解.任何帮助将不胜感激.谢谢
使用异步方法使用内置方法创建延迟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锁定,你应该看到你的期望.
此外,该时间以毫秒为单位,意味着等待"十分之一秒".这真的非常非常快.您可能希望将其减慢一点以获得所需的效果.