2010-10-01 73 views
3

有可能我打电话Thread.Sleep(1000),并且应用程序可能会在一分钟或更长时间内进入非常长时间的睡眠状态?Thread.Sleep问题

它看起来像是在我的应用程序中发生。我正在使用Thread.Sleep,应用程序似乎挂在中间。

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

编辑:

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

那么* *之前* Thread.Sleep是什么? – 2010-10-01 14:44:34

+0

它是一行写入串口... _port.WriteLine(command +“\ r”); – Manoj 2010-10-01 14:46:06

+0

请发布代码! – xxxxxxxxxadfas 2010-10-01 14:49:35

回答

3

处于睡眠状态的线程并不一定表示它在字面上位于Thread.Sleep内;它只是意味着它在某个地方被封锁了。在这种情况下,它可能会阻塞你的串行端口写出于某种原因里面,从一些更深层次的COM端口问题可能制止从你的话题在这里:C# COM port communication problem

+0

是的,最终可能是同样的问题...我需要进一步研究它。我想我应该休息一下,然后回来...... – Manoj 2010-10-01 14:53:43

1

这听起来像您的来电Thread.Sleep甚至没有正在取得进展。您可以在睡眠之前向代码添加Debug.WriteLine("About to call sleep");行吗?这是否会在你延迟许多秒之前打印出来?

+0

这是可能的。问题是它随机发生。我会检查这个角度... – Manoj 2010-10-01 14:55:35

2

这是可能的Thread.Sleep()采取比所需的毫秒数更长的时间才能返回,确实很可能,因为直到线程在时间过去之后获得CPU分片时才会返回。

但是,花一分钟时间才能返回的可能性不大。

虽然它可能是一个循环中最重的单个语句,因为它实际上不应该循环(或者不应该循环太多等)。在这种情况下,进入调试器很可能会在线程休眠的地方这样做(因为它是最重的单个指令,它最有可能被破坏找到它),所以即使真正的问题是这样的不正确的循环,就是通过突破而发现的“问题点”。

这也可能是线程在别处睡着了。既然你在做I/O操作,我会在它上面投入很多钱,实际上是I/O阻塞问题。

尝试1)检查I/O操作是否真的发生,以及2)在I/O之前设置断点并逐步完成。

1

Thread.Sleep()是我认为有限可用性的一个函数。我发现通过的超时值似乎比硬超时值更像是一个建议。我发现以下代码在时间间隔方面更加精确:

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