Thread.Sleep问题

时间:2010-10-01 14:43:26

标签: c#

我是否可以调用Thread.Sleep(1000)并且应用程序可能会在很长一段时间内进入睡眠状态,如一分钟或更长时间?

看起来这种情况正在我的应用程序中发生。我正在使用Thread.Sleep,应用程序似乎挂在中间。

当我按下Ctrl + Alt + Break时,它指向Thread.Sleep调用之前的行。如果我尝试观察任何变量,它表示线程处于休眠状态且变量不在范围内。

编辑:

public void Write(string command)
        {
            _port.WriteLine("\r");
            _port.WriteLine(command + "\r");
            Thread.Sleep(100);
        }

4 个答案:

答案 0 :(得分:3)

处于睡眠状态的线程并不一定意味着它在Thread.Sleep中;它只是意味着它在某个地方被封锁了。在这种情况下,由于某些原因,它可能在您的串口写入中被阻止,可能源于您的主题中的一些更深入的COM端口问题:C# COM port communication problem

答案 1 :(得分:2)

Thread.Sleep()有可能花费超过所需的毫秒数返回,实际上非常可能,因为它不会返回,直到线程获取之后的>

但是,要花一整分钟才能返回,不太可能。

但是,它可能是循环中最重的单个语句,总体上很重,因为它实际上不应该循环(或者不应该循环那么多,等等)。在这种情况下,进入调试器很可能会在线程休眠的时候这样做(因为它是最重的单指令,它最容易被破坏以找到它)所以即使真正的问题是这个不正确的循环,只是通过破坏而被发现为“问题点”的睡眠。

线程也可能在其他地方睡着了。由于你正在进行I / O,我会把钱放到它实际上是I / O阻塞这就是问题。

尝试1)检查I / O操作是否实际发生,2)在I / O之前设置断点并单步执行。

答案 2 :(得分:1)

听起来你对Thread.Sleep的呼唤甚至没有被发现。您可以在睡眠前向代码中添加Debug.WriteLine("About to call sleep");行吗?这是在你的第二次延迟之前打印出来的吗?

答案 3 :(得分:1)

我认为Thread.Sleep()是有限可用性的一个功能。我发现传递的超时值似乎更像是一个建议而不是硬超时值。我发现以下代码在时间间隔方面更准确:

        ManualResetEvent dummy = new ManualResetEvent(false);
        dummy.WaitOne(100);
        //...