我发现System.Monitor非常令人困惑,虽然我理解线程,锁,死锁,竞争条件,餐饮哲学家和所有爵士乐.通常我使用ManualResetEvent()来进行线程间协调,但我知道这是一个重量级的内核对象,System.Monitor(Enter/Pulse等)效率更高.我用谷歌搜索和谷歌搜索,但找不到一个明智的例子.
如果SO工作人员可以向我解释这个可能很棒的构造,我将非常感激:-)
这是一个非常简单的例子; 调用Wait
释放锁(允许Worker
获取它)并将Main
线程添加到锁对象的挂起队列中.Worker
然后获取锁,并调用Pulse
:这会将Main
线程移动到锁对象的就绪队列中.当Worker
解除锁定,Main
可以恢复工作.
请注意,这lock(obj) {...}
只是try/finally块中Monitor.Enter
/的编译器糖果Monitor.Exit
.
[编辑:我更改了样本以lock(sync)
提前移动,以避免错过Pulse的(不太可能)风险]
static void Main() { object sync = new object(); lock (sync) { ThreadPool.QueueUserWorkItem(Worker, sync); Console.WriteLine("Main sleeping"); // wait for the worker to tell us it is ready Monitor.Wait(sync); Console.WriteLine("Main woke up!"); } Console.WriteLine("Press any key..."); Console.ReadKey(); } static void Worker(object sync) { Console.WriteLine("Worker started; about to sleep"); Thread.Sleep(5000); Console.WriteLine("Worker about pulse"); lock (sync) { // notify Main that we did something interesting Monitor.Pulse(sync); Console.WriteLine("Worker pulsed; about to release lock"); } Console.WriteLine("Worker all done"); }