我已经从java迁移到C#,并对wait()和sleep()感到困惑。在 java 中,睡眠不会删除对象的锁,并且在睡眠完成后线程恢复工作,在等待的情况下,它会从对象中删除锁并允许其他线程访问该对象一段时间。
这在 C# 中是否也是如此,或者有任何差异?
是的,在 C# 中也是如此。在大多数情况下,Java中的Thread.sleep
、Object.wait
、Object.notify
、Object.notifyAll
与.NET中的Thread.Sleep
、Monitor.Wait
、Monitor.Pulse
、Monitor.PulseAll
非常对应。
我希望在细节上有一些差异,比如公平性,但基本的工作方式是一样的。
但是,在现代代码中,无论是在 Java 还是 C# 中,您都很少使用这些低级抽象 - 在 Java 中,在 java.util.concurrent
中使用更高级的抽象,而在 .NET 中,如果可以的话,请尝试使用Task
抽象(如果您使用的是 .NET 4)。特别是,使用 Task
将使你为 C# 5(和 WinRT)中的异步盛宴做好准备。