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);}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何学习前端?
前端对我们的审美要求比较高,前端说难也难,说不难也不难。说难是难在审美上,如果让一个审美不好的屌丝(比如我)来做前端的话,设计的界面一定会丑到爆!比如我的个人网站,嘻嘻,说不难是因为编写代码的难度不大。学习前端的逻辑就相当于背诵文言文,只要您肯努力,就一定会学得好前端,我靠尼玛.门槛也太低了。这其中也体现出了社会的不公?究竟是为什么?导致了颇有成就的中科院物理学博士后一个月的月薪只有5-8K,而仅仅一个做前端的程序员花很短的时间做出一个微信小程序,或者网站就会得到5-8k。而真正为我们社会做出巨大贡献的肯定是我们的物理学博士后。前端程序员的性质就和我餐厅里的主厨性质相似,虽然并没有什么技术难度,也对社会没有做出实质上的贡献,但是薪资却比较多,同样也是通过学习一样技能而获得的。因此做web前端的程序员和当一个餐厅里的主厨并没有实质上的区别。而且很多web前端程序员很多想去餐厅里当主厨。这也是个人内心十分鄙视web前端程序员的原因,但是我曾经又是个web前端程序员,这是不是相当矛盾呢?哈哈 废话不多说,现在开始介绍如何学习前端。首先,你可以话较短的时间学习完html5语言,html5即是:...
- 下一篇
记一次Golang内存分析——基于go pprof
1. 背景 阿里云Redis线上在某些任务流中使用redis-port来进行实例之间的数据同步。redis-port是一个MIT协议的开源软件,主要原理是从源实例读取RDB快照文件、解析、然后在目标实例上应用灌数据的写命令。为了限制每个进程的最大内存使用,我们使用cgroup来做隔离,最近线上出现redis-port在同步数据时OOM的情况,最高内存使用达到了10G以上,而实际RDB的大小只有4.5GB左右。 2. 分析 2.1 GCTRACE Golang,自带gc,在不改动代码的情况下,我们可以设置GODEBUG='gctrace=1'环境变量启动程序,来向标准错误输出打印gc log, gc 21 @8.389s 0%: 0.069+4.0+0.16 ms clock, 1.6+2.8/14/10+4.0 ms cpu, 87->
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群