【问题标题】:C# equivalent to java's wait and notify?C#相当于java的等待和通知?
【发布时间】:2008-10-16 16:16:55
【问题描述】:

我知道您可以在 c# 中使用 lock 锁定一个对象,但您可以放弃锁定并等待其他东西通知您它已更改,就像您在 java 中使用 wait 和 notify 一样?

在我看来,java 和 c# 中的 synchronized 和 lock 分别是同义词。

【问题讨论】:

    标签: c# java multithreading


    【解决方案1】:

    等效功能(包括普通锁定)在Monitor 类中。

    foo.notify() => Monitor.Pulse(foo)
    foo.notifyAll() => Monitor.PulseAll(foo)
    foo.wait() =>  Monitor.Wait(foo)
    

    C# 中的 lock 语句等效于使用适当的 try/finally 块调用 Monitor.EnterMonitor.Exit

    请参阅my threading tutorialJoe Albahari's one 了解更多详情。

    【讨论】:

    • 来自 Java API:wait() - 导致当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。您的教程似乎是说 Monitor.Wait() 仅在另一个线程竞争锁定时才等待。
    • @ebyrob:这表明在哪里?
    • 哦,抱歉,是 MSDN 文章让我感到困惑:msdn.microsoft.com/en-us/library/… 它说“//等待,如果队列忙。在调用之前:Monitor.Wait(m_smplQueue);”我同时阅读了这两本书,对哪个是哪个感到困惑。
    • 我将这些封装在扩展方法中,以便更轻松地从 Java 移植我的代码。
    • @SteveTaylor:另一方面,对于具有 .NET 背景的任何人阅读您的代码,这将变得不那么惯用...我想这取决于您的团队。
    【解决方案2】:

    我认为等待句柄可能对你有用。看看this 是否有帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多