我是否可以调用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);
}
答案 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);
//...