在C#中,Wait
和Lock
可以一起使用,但它们分别属于不同的类:Wait
属于System.Threading.Monitor
类,而Lock
属于System.Threading.Monitor
类的一个静态属性。
Monitor.Wait
方法用于等待一个对象监视器上的锁被释放。当调用Monitor.Wait
方法时,当前线程会释放对象的锁并进入等待状态。当其他线程调用Monitor.Pulse
或Monitor.PulseAll
方法时,等待的线程将被唤醒并重新尝试获取对象的锁。
Monitor.Lock
是一个静态属性,用于获取一个对象的监视器上的锁。当调用Monitor.Lock
方法时,当前线程会获取对象的锁并继续执行。如果锁已被其他线程持有,则当前线程将阻塞,直到锁被释放。
以下是一个使用Monitor.Wait
和Monitor.Lock
的示例:
using System; using System.Threading; class Program { private static readonly object _lockObject = new object(); static void Main() { Thread thread1 = new Thread(Thread1); Thread thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); } static void Thread1() { Monitor.Lock(_lockObject); Console.WriteLine("Thread1 acquired the lock."); // Simulate some work Thread.Sleep(1000); Monitor.Wait(_lockObject); Console.WriteLine("Thread1 released the lock and is waiting."); // Simulate some more work Thread.Sleep(1000); Monitor.Exit(_lockObject); Console.WriteLine("Thread1 exited."); } static void Thread2() { Monitor.Lock(_lockObject); Console.WriteLine("Thread2 acquired the lock."); // Simulate some work Thread.Sleep(1000); Monitor.Pulse(_lockObject); Console.WriteLine("Thread2 pulsed the lock."); Monitor.Exit(_lockObject); Console.WriteLine("Thread2 exited."); } }
在这个示例中,Thread1
和Thread2
都尝试获取同一个对象的锁。Thread1
首先获取锁并执行一些工作,然后释放锁并等待。Thread2
在Thread1
释放锁后获取锁并执行一些工作,然后通过Monitor.Pulse
唤醒Thread1
。最后,两个线程都释放锁并退出。