繁体   English   中英

Thread.Sleep问题

[英]Problem with Thread.Sleep

是否有可能我调用Thread.Sleep(1000)并且应用程序可能会像一分钟或更长时间一样长时间地睡眠?

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

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

编辑:

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

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

Thread.Sleep()可能需要比返回所需的毫秒数更长的时间,实际上非常可能,因为直到线程在时间过去之后获得CPU切片时它才会返回。

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

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

线程也可能在其他地方睡着了。 既然你正在做I / OI就会把钱花在实际上是I / O阻塞的问题上。

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

这听起来像是你对Thread.Sleep的调用甚至没有被制作出来。 你能添加一个Debug.WriteLine("About to call sleep"); 在睡觉之前排到你的代码? 这是在你的许多秒延迟之前打印出来的吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM