zoukankan      html  css  js  c++  java
  • C#编程任务: 把工作交给别人并等待其执行完成

    生活中有这样的场景: 

    我有一件事情需要别人帮忙去办, 但是别人也很忙呀, 所以我只能把任务记载他的任务清单上, 等他一个个扫下来扫到我的并且完成之后再来告诉我.

    这其实是一个多线程的问题. 我是线程A, 他是线程B, 这里我是生产者, 他是消费者. 而我在等待他完成我提交的任务之前并不能做什么事情, 也就是说我, 线程A, 得阻塞等待B执行完我的任务并来通知我. 

    貌似实现起来挺简单, 一个死循环加一个bool就可以了. 在任务Obj中加bool isCompleted=false; 当线程B执行完成之后设置成true. 而我就while(!isCompleted);死等就可以了. 嗯, 这里的死等可能会让单核CPU100%那么while(!isCompleted){Thread.Sleep(1);}这样就完美了.

    确实不错, 但是能不能优雅一点? 

    比如使用Monitor. 我翻了一下msdn...没什么想说的了, 这个sample写的跟直接叫你去使用lock关键字一样.

    对于大多数情况下的线程资源加锁, 其实使用关键字lock真的可以了. 但是在这个情况下, 需要用到另外两个函数:

    Monitor.Wait()和Monitor.Pulse()

    代码如下:

            static void MonitorSample()
            {
                var obj = new object();
                Monitor.Enter(obj);
                Console.WriteLine(DateTime.Now);
                Thread t = new Thread(() => {
                    Thread.Sleep(2000);
                    Monitor.Enter(obj);
                    Thread.Sleep(2000);
                    Monitor.Pulse(obj);
                    Thread.Sleep(2000);
                    Monitor.Exit(obj);
                });
                t.Start();
                Monitor.Wait(obj);
    
                Console.WriteLine(DateTime.Now);
                Console.WriteLine("over");
                Console.ReadKey();
            }

    跑一遍再看看函数说明就清楚了. 

    注意实际使用中最好加上try{}finally{Monitor.Exit(xxx);}

  • 相关阅读:
    福大软工1816 · 第一次作业
    Python学习
    实验12——指针的基础应用2
    实验11——指针的基础应用
    实验十——一维数组的定义及引用
    实验九——基本数据类型存储及应用总结
    实验八——函数定义及调用总结
    实验七——函数定义及调用总结
    实验六——循环结构程序练习总结
    实验五——循环结构学习总结
  • 原文地址:https://www.cnblogs.com/pasoraku/p/8682761.html
Copyright © 2011-2022 走看看