【问题标题】:Delay function in C#C#中的延迟函数
【发布时间】:2017-09-08 01:20:34
【问题描述】:

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

【问题讨论】:

  • WinForms 是单线程的,您对Thread.Sleep 的调用将阻塞线程。您必须避免阻塞 UI 线程。文本框只会在控件屈服于 WM_PAINT 窗口消息处理程序时更改颜色,这在您的代码中从未发生过。
  • 查看this article以了解如何使用代码块。

标签: c# timer


【解决方案1】:

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

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

根据您的具体情况

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);
    }
 }

【讨论】:

  • 我使用了这段代码并得到了想要的结果。我还能够将这种理念应用于以所需的时间间隔轮询操纵杆。感谢 Aluan 修改代码和 Chad 提出概念,
【解决方案2】:

问题不在于延迟,而在于 UI 应用程序的线程模型。在 UI 应用程序中,任何事件处理程序都发生在“UI 线程”上。当代码运行时,UI 基本上是冻结的,所以你在那里做什么都不重要。

这意味着如果您在那里“休眠”,整个应用程序将锁定并且在它返回之前没有响应。

但是,如果您的事件处理程序需要执行长时间运行的工作,您可以将它们设置为“async void”,而不仅仅是“void”。然后,如果您使用await Task.Delay(someTime) 而不是Thread.Sleep(someTime),它将在发生这种情况时释放 UI 线程。在没有锁定 UI 的情况下,您应该会看到预期的结果。

此外,该时间以毫秒为单位,表示等待“十分之一秒”。这真的非常快。您可能需要放慢速度以获得您想要的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多