当前位置:  开发笔记 > 编程语言 > 正文

有人可以给我一个如何在C#中使用System.Monitor的简单示例吗?

如何解决《有人可以给我一个如何在C#中使用System.Monitor的简单示例吗?》经验,为你挑选了1个好方法。

我发现System.Monitor非常令人困惑,虽然我理解线程,锁,死锁,竞争条件,餐饮哲学家和所有爵士乐.通常我使用ManualResetEvent()来进行线程间协调,但我知道这是一个重量级的内核对象,System.Monitor(Enter/Pulse等)效率更高.我用谷歌搜索和谷歌搜索,但找不到一个明智的例子.

如果SO工作人员可以向我解释这个可能很棒的构造,我将非常感激:-)



1> Marc Gravell..:

这是一个非常简单的例子; 调用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");
    }

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有