【问题标题】:Why does Thread.Sleep() method sleep more than expected?为什么 Thread.Sleep() 方法的睡眠时间比预期的要长?
【发布时间】:2014-07-05 22:50:59
【问题描述】:

所以,我的程序基本上是创建一个 Main 的子线程,并从用户那里获取一个整数作为输入,然后将该数字通过 1000 定时转换为毫秒。

但在 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 秒。

此外,当我将替换 mili 更改为 5000 以使线程休眠 5 秒时,每次它循环时,它都能正常工作,但循环的迭代次数超出了我的预期。例如,这是我输入的输入:

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

. . . . . . . . . .      

每次迭代都会正确计算 5 秒。但它迭代了 5 次以上。如果我输入 5,那么 for 循环不应该迭代 5 次并中止吗?只显示 5 个句点?

【问题讨论】:

  • @L.B 但是 5 秒和 10 秒的区别不是很大吗?
  • 我不认为在这种情况下这是重复的。如果它关闭了几毫秒,那么是的。秒...不。
  • @Steve 是的,我试过了,然后我得到一个未处理的异常:System.FormatException。
  • @Steve 我输入的只是数字 5 和两个新行。我不知道为什么,但我不得不按两次回车来发送输入..
  • 为什么不尝试使用调试器单步执行代码?

标签: c# multithreading thread-sleep


【解决方案1】:

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

如果您输入5,则会打印53

Console.WriteLine("{0}", Console.Read());

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

【讨论】:

  • 是的,我尝试了 Console.ReadLine(),但我得到了一个未处理的异常:System.FormatException。你知道为什么吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2012-07-07
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多