c#中For循环的时间延迟

Abd*_*him 12 c# timer

如何在一定的旋转后在循环中使用时间延迟?假设:

for(int i = 0 ; i<64;i++)
{
........
}
Run Code Online (Sandbox Code Playgroud)

我希望在每8次旋转后延迟1秒.

Eri*_*ert 41

有很多方法可以做到这一点:

  • 方法一:犯罪可怕:忙碌等待:

    DateTime timeToStartUpAgain = whatever;

    while(DateTime.Now < timeToStartUpAgain) {}

这是一件可怕的事情; 操作系统将假设您正在做有用的工作,并将指定一个CPU除了旋转之外什么都不做.除非你知道旋转只会持续几微秒,否则永远不要这样做.基本上当你这样做时,你雇了一个人为你看时钟; 这不经济.

  • 方法二:非常糟糕:睡觉线程.

睡觉线程也是一件可怕的事情,但不如加热CPU那么可怕.睡眠线程告诉操作系统"此应用程序的此线程应暂时停止响应事件并且不执行任何操作".这比聘请某人为你看钟表更好; 现在你雇了一个人为你睡觉.

  • 方法三:将工作分解为更小的任务.创建一个计时器.当你想要延迟时,不要做下一个任务,而是做一个计时器.当计时器触发其tick事件时,请选择您中断的任务列表.

这有效地利用了资源; 现在你正在雇人煮鸡蛋,而鸡蛋正在做饭,他们可以做吐司.

然而,编写程序以便将工作分解为小任务是一件痛苦的事.

  • 方法四:使用C#5支持异步编程; 等待Delay任务,让C#编译器负责重构您的程序,使其高效.

这方面的缺点当然是C#5目前仅处于测试阶段.

注意:从Visual Studio 2012开始,C#5正在使用中.如果您使用的是VS 2012或更高版本,则可以使用异步编程.


Ada*_*man 14

如果你想在每8次迭代后休眠一下,试试这个:

for (int i = 0; i < 64; i++)
{
    //...
    if (i % 8 == 7)
        Thread.Sleep(1000); //ms
}
Run Code Online (Sandbox Code Playgroud)


ale*_*exn 8

使用Thread.Sleep(来自System.Threading):

for(int i = 0 ; i<64;i++)
{
     if(i % 8 == 0)
        Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

  • 这将在第一次迭代后休眠. (2认同)