线程休眠的问题

3

我能否调用 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);
        }

1
Thread.Sleep 之前的那一行是什么? - Kirk Woll
这是一行写入串口的代码... _port.WriteLine(command + "\r"); - Manoj
4个回答

3
线程休眠并不一定意味着它确实在 Thread.Sleep 中;它只是表示它被阻塞在某个地方。在这种情况下,很可能是由于串行端口写入时出现了某些问题而被阻塞,可能源自您在此处的主题中提到的更深层次的 COM 端口问题:C# COM 端口通信问题

是的,最终可能是同样的问题...我需要进一步研究一下。我想我应该休息一下,然后再回来... - Manoj

2
< p > Thread.Sleep() 可能需要比所需的毫秒数更长的时间才能返回,实际上很可能会发生这种情况,因为它只有在线程在经过时间后获得 CPU 切片时才会返回。

但是,它要花费整整一分钟才能返回的可能性不大。

然而,它可能是一个循环中最重要的单个语句,该循环本身就很重,因为它实际上不应该循环(或者不应该循环那么多等)。在这种情况下,进入调试器很可能会在线程休眠的点上停止(因为它是最重要的单个指令,因此最有可能通过断点找到它),因此即使真正的问题是这个不正确的循环,也会被认为是“问题点”的睡眠通过简单的中断来找到。

还有可能是线程在其他地方处于睡眠状态。由于您正在进行 I/O 操作,我会把钱放在实际上是 I/O 阻塞是问题的原因上。

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


1

看起来你的 Thread.Sleep 调用并没有被执行。你可以在睡眠之前在代码中添加一行 Debug.WriteLine("About to call sleep"); 来测试一下吗?这一行是否会在几秒钟的延迟之前被打印出来?


1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接