【问题标题】:System.Threading.Thread.Sleep on Mono with Timeout.InfiniteSystem.Threading.Thread.Sleep on Mono with Timeout.Infinite
【发布时间】:2011-07-24 15:07:47
【问题描述】:

我在这里遇到了一个奇怪的问题。我正在使用 Mono 的 Red Hat Enterprise Linux 上运行以下 C# 代码。我看到的是 Thread.Sleep(Timeout.Infinite);有时根本睡不着。我期望的是线程在睡眠时阻塞,其他一些线程在睡眠线程上执行中断()并且“异常被捕获!”行被打印出来。

我看到的是“Pre”和“Post”被打印出来。 (顺便说一句,我正在维护别人的代码,我不会使用 sleeps 但我现在不得不忍受它)。

我在网上查看并试图查看是否存在 Thread.Sleep 无法睡眠但找不到任何东西的情况。任何提示都表示赞赏。

mj

try{
    Console.WriteLine("Pre");
    Thread.Sleep( Timeout.Infinite );
    Console.WriteLine("Post");
} catch( ThreadInterruptedException e )
{
    Console.WriteLine( "Exception caught!" );
}

【问题讨论】:

  • 如果将其更改为非无限的非常大的数字会怎样? int.MaxValue 已经超过 24 天了,改用它可以吗?此外,您提到它“有时”根本不睡觉。它的发生频率如何?您是否注意到它的发生规律?
  • 我尝试将其设置为 int.MaxValue 并且遇到了同样的问题。发生的情况是它会运行六次就好了(它在一个循环中),然后当它中断时它就会变得疯狂,我会看到大量的日志。
  • 如果将其设置为中等长度(比如一个小时左右)会发生什么?

标签: c# mono sleep


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为最好的答案是用 AutoResetEvent 或信号量替换 Thread.Sleep。这应该是一个相对干净的交换,并且不应该是对现有应用程序的重大架构更改,例如切换到 ThreadPool 或类似的东西。

    如果这不可能,那么我会看看睡眠线程是否有可能知道是否有工作要做。如果它可以拥有该知识,则将睡眠设置为中等,例如一个小时左右,假设有效。如果线程碰巧在一小时后醒来,没有工作可做,它会发现它无事可做,然后重新进入睡眠状态。

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

    【讨论】:

    • 我想我明白了。有人安装了一个由我们的合作伙伴开发的应用程序,该应用程序用他们自己的一些依赖项替换了一些依赖项。我不知道他们能做什么,但他们做了一些事情。我个人也喜欢重置事件,这就是我会做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多