为什么Thread.Sleep()方法睡眠超过预期?

时间:2014-07-05 22:50:59

标签: c# multithreading thread-sleep

所以,我的程序基本上是创建一个Main线程的子线程,并从用户那里得到一个整数作为输入,并通过将它计时1000来将该数字转换为milisecond。

但是在for循环中,当我输入数字5作为输入时,Thread.Sleep()会休眠大约10秒。

代码:

static void CallToChildThread()
{

     Console.WriteLine("How many seconds do you want this thread to rest?");
     int time = Convert.ToInt32(Console.Read());
     int mili = time * 1000;

     for (int i = 0; i < time; i++)
     {
         Console.Write(". ");
         Thread.Sleep(mili);
     }

     Console.WriteLine();

}

因此,当我键入5时,代码将乘以5乘以1000并将5000存储在mili中。

但是,在for循环中,当执行Thread.Sleep(mili)时,它不会整整睡5秒,它会在循环中迭代一次后休眠10秒。

另外,当我用5000更改替换mili以使线程休眠5秒时,每次循环,并且它工作,但循环迭代超过我的预期。例如,这是我输入的输入:

How many seconds do you want this thread to rest?
5

. . . . . . . . . .      

每次迭代都会正确计算5秒。但它迭代次数超过5.如果我键入5然后不应该for循环迭代5次并中止?只显示5个时期?

2 个答案:

答案 0 :(得分:6)

Console.Read()读取一个字符,然后将其ASCII码转换为int

如果您输入53

,则会打印5
Console.WriteLine("{0}", Console.Read());

顺便说一句,你将5乘以1000,然后睡眠已经相乘的值。因此,在循环中睡眠的总时间似乎是5 * 5 * 1000,而不是5 * 1000 ms。这是故意的吗?

答案 1 :(得分:3)

您需要使用 Console.ReadLine()而不是 Console.Read()

int time = Convert.ToInt32(Console.ReadLine());