我在这里遇到了一个奇怪的问题。我在使用Mono的Red Hat Enterprise Linux上运行以下C#代码。我所看到的是Thread.Sleep(Timeout.Infinite);有时根本不睡觉。我期望的是线程在睡眠时阻塞,其他一些线程在睡眠线程上执行Interrupt()并且“异常被捕获!”线被打印出来。
我看到的是“Pre”和“Post”被打印出来。 (顺便说一句,我维护别人的代码,我不会使用睡眠,但我现在必须忍受它。)
我在线查看并试图查看是否存在Thread.Sleep无法入睡但无法找到任何内容的情况。任何提示都表示赞赏。
MJ
try{
Console.WriteLine("Pre");
Thread.Sleep( Timeout.Infinite );
Console.WriteLine("Post");
} catch( ThreadInterruptedException e )
{
Console.WriteLine( "Exception caught!" );
}
答案 0 :(得分:2)
实际上,这是Mono中的一个错误。见错误683519。
答案 1 :(得分:1)
我认为最好的答案是将Thread.Sleep替换为AutoResetEvent,或者可能是Semaphore。这应该是一个相对干净的交换,并且不应该是对现有应用程序的主要架构更改,例如切换到ThreadPool或类似的东西。
如果那是不可能的,那么我会看看睡眠线程是否有可能知道它是否有效。如果它可以拥有这些知识,那么将睡眠设置为中等,比如一小时左右,假设有效。如果线程在一个小时之后就会被唤醒而没有工作要做,那么就会发现没有什么可以做的,然后再回去睡觉了。
此外,无限的睡眠不起作用是一个相当重要的错误。您使用的是Mono的最新版本吗?如果这是在以后的版本中修复的错误,您是否可以切换到其他版本?