C# 单声道上的System.Threading.Thread.Sleep带超时。无限

C# 单声道上的System.Threading.Thread.Sleep带超时。无限,c#,mono,sleep,C#,Mono,Sleep,我这里有个奇怪的问题。我正在使用Mono在Red Hat Enterprise Linux上运行以下C#代码。我看到的是线程.Sleep(Timeout.Infinite);有时根本不睡觉。我所期望的是线程阻塞睡眠,其他线程在睡眠线程上执行中断(),并打印“Exception Capture!”行 相反,我看到的是“打印前”和“打印后”。 (顺便说一句,我正在维护别人的代码,我不会使用sleeps,但我现在不得不接受它) 我在网上查了一下,想看看是否有这样一种情况:Thread.Sleep就是睡

我这里有个奇怪的问题。我正在使用Mono在Red Hat Enterprise Linux上运行以下C#代码。我看到的是线程.Sleep(Timeout.Infinite);有时根本不睡觉。我所期望的是线程阻塞睡眠,其他线程在睡眠线程上执行中断(),并打印“Exception Capture!”行

相反,我看到的是“打印前”和“打印后”。 (顺便说一句,我正在维护别人的代码,我不会使用sleeps,但我现在不得不接受它)

我在网上查了一下,想看看是否有这样一种情况:Thread.Sleep就是睡不着,但什么也找不到。任何提示都将不胜感激

乔丹


我认为最好的解决办法是替换线程。使用AutoResetEvent或信号灯睡觉。这应该是一个相对干净的交换,不应该是对现有应用程序的主要架构更改,比如切换到ThreadPool或类似的东西

如果这是不可能的,那么我想看看睡眠线程是否有可能知道是否有工作要做。如果它能掌握这方面的知识,那么就把睡眠时间设为中等,比如说一个小时左右,假设这样做有效的话。如果线程在一个小时后碰巧醒来,没有工作要做,它会看到它没有什么事情要做,然后继续睡觉


此外,无限睡眠不工作对我来说是一个相当重要的缺陷。您使用的是最新版本的Mono吗?如果这是一个在更高版本中修复的错误,您可以切换到其他版本吗?

实际上,这是Mono中的一个错误。请参阅bug 683519。

如果将其更改为非无穷大的数字,会发生什么情况
int.MaxValue
已超过24天,切换到使用它是否有效?此外,你提到它“有时”根本不睡觉。它的出现频率有多高?您是否注意到它的出现模式?我尝试将其设置为int.MaxValue,但我遇到了相同的问题。发生的事情是,它会运行六次,很好(它在一个循环中),然后当它崩溃时,它会变得疯狂,我看到成吨成吨的原木。如果你把它设置为中等长度,比如说一个小时左右,会发生什么?我想我知道了。有人安装了一个由我们的合作伙伴开发的应用程序,用他们自己的一些依赖项替换了一些依赖项。我不知道他们能做什么,但他们做了些什么。我个人也喜欢重置事件,这也是我应该做的。
try{
    Console.WriteLine("Pre");
    Thread.Sleep( Timeout.Infinite );
    Console.WriteLine("Post");
} catch( ThreadInterruptedException e )
{
    Console.WriteLine( "Exception caught!" );
}