大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> 完整版本的办公室故事,转自发赛特社区

完整版本的办公室故事,转自发赛特社区

时间: 2021-07-31 作者:daque

.net中的委派—事变体制: 接待室的故事chris sells 著 ( <<atl internals>>一书作家之一,该书是atl编制程序的宝典)jackeygou 译 研制重心 软硬件本领的动听美感根源于对实际寰球的如实领会. 一— 译注===========================================强典型啮合------------往日在咱们这个都会的西南角,有一家小本领效劳公司,公司里有一位聪慧才干的年青人,他的名字叫peter。悲惨的是他的东家却是一位吝惜、多疑,并且极为安分守己的小丑,比方部下的任何处事都必需先汇报,并且经他审查批准后本领举行。不幸的peter天然不愿他的东家成天里站在本人的死后虎视眈眈,所以他对东家保护,本人的任何处事进度城市向他准时通禀。peter实行这一许诺的本领即是周期性的运用典型援用回调boss,把他东家叫过来查看。步调实行如次:class worker { public void advise(boss boss) { _boss = boss; }public void dowork() {console.writeline("worker: work started");if( _boss != null ) _boss.workstarted(); // 发端处事的审查批准console.writeline("worker: work progressing");if( _boss != null ) _boss.workprogressing(); // 举行处事的审查批准console.writeline("worker: work completed");if( _boss != null ) {int grade = _boss.workcompleted(); // 实行处事的审查批准console.writeline("worker grade= " + grade);}}private boss _boss;}class boss {public void workstarted() { /* 东家本质上并不很关怀. */ }public void workprogressing() { /*东家本质上并不很关怀. */ }public int workcompleted() {console.writeline("it's about time!");return 2; /* 满分10分,才给2分,够吝惜吝啬吧. */}}class universe {static void main() {worker peter = new worker(); // 天生peter范例boss boss = new boss(); // 天生boss范例peter.advise(boss);peter.dowork();console.writeline("main: 处事中断!");console.readline();}}【译注:以次是上段步调输入截止:worker: work startedworker: work progressingworker: work completedit's about time!worker grade = 2main: worker completed work】接口----------此刻peter仍旧变成一个特出的分子,由于它不只要忍耐它那位吝惜东家的指示,并且还与universe东西精细关系(没方法谁让他身不逢时居于universe类的main因变量中)。这种“接近交战”使peter感触universe对他的处事进度也很感爱好。悲惨的是,除去保护boss不妨被报告外,即使不为universe增添一个特出的报告本领和回调,peter没辙向universe报告其处事进度。而peter开始要做的即是从简直的报告实行进程中辨别出湮没的报告商定,而这就须要设置接口了:interface iworkerevents {void workstarted();void workprogressing();int workcompleted();}class worker {public void advise(iworkerevents events) { _events = events; }public void dowork() {console.writeline("worker: work started");if( _events != null ) _events.workstarted();console.writeline("worker: work progressing");if(_events != null ) _events.workprogressing();console.writeline("worker: work completed");if(_events != null ) {int grade = _events.workcompleted();console.writeline("worker grade= " + grade);}}private iworkerevents _events;}class boss : iworkerevents {public void workstarted() { /* boss doesn't care. */ }public void workprogressing() { /* boss doesn't care. */ }public int workcompleted() {console.writeline("it's about time!");return 3; /* out of 10 */}}【译注:以次是上段步调输入截止:worker: work startedworker: work progressingworker: work completedit's about time!worker grade = 3main: worker completed work】委派-----------悲惨的是,peter成天忙于报告他的东家去控制实行接口,而无暇照顾报告universe。然而peter感触这仍旧不远了,由于起码他仍旧胜利的将对简直东家的援用,笼统为对一致的iworkerevents接口的援用了。换句话说,其余实行了iworkerevents接口的什么人都不妨收到处事进度报告。就如许,过了一段功夫,peter的东家仍旧对peter很生气,他高声的埋怨到:“hi! peter,你领会不领会,你真的很烦呀!干什么你历次在发端处事和处事举行时都要叫上我,我并不是历次都对那些进程感爱好。你不只抑制我做少许我不感爱好的工作,并且你还滥用了洪量珍贵的处事功夫在等我从审查批准事变中归来。即使我很忙,不许做出回复,莫非你就要休假不可?你能不不妨别如许来打扰我,ok?”此时,peter渐渐认识到沿用接口在很多功夫时利害常有效的(译注:接口在com寰球里,不妨称得上是万物之本),然而用接口来处置事变时,就有些粒度(译注:不是力度)不够精致。他蓄意在事变爆发时只报告哪些对该事变感爱好的人,而不是让一部分必需对一切的事变感爱好。以是,peter将接口进一步分割成更小的独力的委派因变量,每一个委派因变量不妨看作是一个轻量级的因变量接口,意旨等价于类接口。delegate void workstarted();delegate void workprogressing();delegate int workcompleted();class worker {public void dowork() {console.writeline("worker: work started");if( started != null ) started();console.writeline("worker: work progressing");if( progressing != null ) progressing();console.writeline("worker: work completed");if( completed != null ) {int grade = completed();console.writeline("worker grade= " + grade);}}public workstarted started;public workprogressing progressing;public workcompleted completed;}class boss {public int workcompleted() {console.writeline("better...");return 4; /* out of 10 */}}class universe {static void main() {worker peter = new worker();boss boss = new boss();peter.completed = new workcompleted(boss.workcompleted);peter.dowork();console.writeline("main: worker completed work");console.readline();}}【译注:以次是上段步调输入截止:worker: work startedworker: work progressingworker: work completedbetter...worker grade = 4main: worker completed work】【译注:对“然而用接口来处置事变时,就有些粒度不够精致。”的领会可用下例证明,请提防查看一下步调,即使十足换作接口设置去向理,推敲一下如许做的倒霉之处。欢送大师计划:using system;interface iworkstartedevent {void workstarted(); }interface iworkprogressingevent{void workprogressing();}interface iworkcompletedevent{int workcompleted();}class worker {public void advise(iworkcompletedevent aevent) {_event = aevent;}public void dowork() { console.writeline("worker: work completed");if(_event != null ) {int grade = _event.workcompleted();console.writeline("worker grade = " + grade);}}private iworkcompletedevent _event;}class boss : iworkcompletedevent {public int workcompleted() {console.writeline("better...");return 4; /* out of 10 */}}class universe {static void main() {worker peter = new worker();boss boss = new boss();peter.advise(boss);peter.dowork();console.writeline("main: worker completed work");console.readline();}}以次是上段步调输入截止:worker: work completedbetter...worker grade = 4main: worker completed work】静态相应因变量---------------如许一来,居然吹糠见米。peter再也不会由于发端处事审查批准等事变而去打扰他的东家。然而此刻的题目是peter仍旧没有将universe加入他的事变相应者名单。由于universe是一个全封锁实业类(all-compassing entity),以是,即使须要与委派贯串,就要范例化universe,简直没需要(构想一下universe的多个范例须要几何资源…)。取而代之,沿用静态因变量实行。由于委派扶助那些静态因变量设置:class universe {static void workerstartedwork() {console.writeline("universe notices worker starting work");}static int workercompletedwork() {console.writeline("universe pleased with worker's work");return 7;}static void main() {worker peter = new worker();boss boss = new boss();peter.completed = new workcompleted(boss.workcompleted);// #peter.started = new workstarted(universe.workerstartedwork);peter.completed = new workcompleted(universe.workercompletedwork); // 这一运用得前方#行枉然了!boss被universe代替了,大概peter更承诺如许。peter.dowork();console.writeline("main: worker completed work");console.readline();}}【译注:以次是上段步调输入截止:worker: work starteduniverse notices worker starting workworker: work progressingworker: work completeduniverse pleased with worker's workworker grade = 7main: worker completed work】事变----------大失所望,固然peter很痛快让universe介入协作,但universe自己很忙也不风气将本人的十足心身都加入到简单的peter范例中,以代替peter东家委派的场所。其余peter类中的委派字段是国有考察权力也会生存少许未知的反面效率。比方,那天peter的东家想不开,遽然确定要亲身激活peter的委派工作,也尚未可知。(按此人的多疑易怒的天性是很有大概的!)// peter的东家本人将委派工作激活,这即是国有权力的效率!!!if( peter.completed != null ) peter.completed();不幸的peter天然不承诺上述的任何一种情景爆发,他须要实行对于每一个委派都能介入备案和反备案因变量,惟有如许事变相应者不妨增添和简略自己, 但谁都不不妨清空所有事变列表,制止展示方才universe将boss取而代之的截止。peter自己对此是爱莫能助了,然而经过c#供给的“event”要害字,peter就不妨理想成真了:class worker {...public event workstarted started;public event workprogressing progressing;public event workcompleted completed;}peter领会运用c#的委派—事变体制不妨轻快搞定,并且这时候event要害字供给了一个对于委派的属性(property),不妨承诺c#存户简单地经过“+=”和“-= ”增添和简略她们自设置的实行因变量,而不像委派那么挂上就甩不掉:static void main() {worker peter = new worker();boss boss = new boss();peter.completed += new workcompleted(boss.workcompleted);peter.started += new workstarted(universe.workerstartedwork);peter.completed += new workcompleted(universe.workercompletedwork);peter.dowork();console.writeline("main: worker completed work");console.readline();}【译注:以次是上段步调输入截止worker: work starteduniverse notices worker starting workworker: work progressingworker: work completedbetter...// 【译注:boss也报告到啦,方才打‘#’那代码被实行了。然而且慢,boss打的士那4分没有获得,反面只获得了universe给的7分】universe pleased with worker's workworker grade = 7main: worker completed work】查问一切截止--------------对于这一点,peter包藏决心。他不妨简单处置一切与事变关系的实行者消息,而不须要与简直的实行者爆发紧啮合联系。peter提防到他的最后处事评定(completed事变)关系了两个事变实行因变量:boss和universe。她们都给peter一个评定分数4分和7分。恰是喜气洋洋的peter天然不会随便抛弃任何一个截止,他蓄意能获得每一个相应者的评阅截止。所以,他确定索取委派挪用列表,再不细工辨别挪用它们并累加,如许他的money….public void dowork() {...console.writeline("worker: work completed");int grade = 0;if( completed != null ) {foreach( workcompleted wc in completed.getinvocationlist() ) {grade += wc();console.writeline("worker grade= " + grade);}}}【译注:以次是上段步调输入截止worker: work starteduniverse notices worker starting workworker: work progressingworker: work completedbetter...worker grade = 4 【译注:boss打的士4分也获得啦】universe pleased with worker's workworker grade = 11【译注:peter共得了11分!】main: worker completed work】异步报告:激活和停止------------------------peter很快又创造了新的题目,他的东家和universe偶尔城市展示正为其余事劳累而无暇照顾peter的处事评定,这就使得peter的处事评定功夫被缓慢了:class boss {public int workcompleted() {system.threading.thread.sleep(3000); // 延时3秒console.writeline("better..."); return 6; /* out of 10 */}}class universe {static int workercompletedwork() {system.threading.thread.sleep(4000); // 延时4秒console.writeline("universe is pleased with worker's work");return 7;}...}噢!看到了,这真实很简单形成功夫的滥用,并且最让peter恼火的是,周末他与kristin的聚会都被搅黄了。不行,这确定要矫正!所以peter确定停止处事评定打分而改为异步委派—事变激活:public void dowork() {...console.writeline("worker: work completed");if( completed != null ) {foreach( workcompleted wc in completed.getinvocationlist() ){wc.begininvoke(null, null);}}}【译注:以次是上段步调输入截止worker: work starteduniverse notices worker starting workworker: work progressingworker: work completedmain: worker completed work //【译注:因为是异步触发事变,所以这一条龙先输入啦】better... //【译注:评阅已被忽视】universe pleased with worker's work //【译注:评阅已被忽视】】异步报告:缓存池(polling)-------------------------------这就使得peter不妨报告监听者的同声本人也能登时归来处事,让过程的线程池挪用委派。但是不久他就创造监听者对其处事的评阅抛弃了。这还特出!没有评定分数,我的绩效…peter几乎欲哭无泪.他登时沿用缓存池(polling)体制。peter领会他做了一件聪明的事并痛快universe动作一个完全(不只单是他的boss)评介他。所以,peter异步触发事变,但按期轮询,以查看不妨赢得的评阅:public void dowork() {...console.writeline("worker: work completed");if( completed != null ) {foreach( workcompleted wc in completed.getinvocationlist() ) {iasyncresult res = wc.begininvoke(null, null);while( !res.iscompleted ) system.threading.thread.sleep(1);int grade = wc.endinvoke(res);console.writeline("worker grade= " + grade);}}}【译注:以次是上段步调输入截止worker: work starteduniverse notices worker starting workworker: work progressingworker: work completedbetter...worker grade = 6universe pleased with worker's workworker grade = 7main: worker completed work //【译注:提防这个截止到结果才输入,下一节首句道理即是如许】】异步报告: 委派----------------悲惨的是,peter又停滞了—就象他一发端想制止boss站在一左右监督他一律。也即是说,他此刻要监看所有处事进程。所以,peter确定运用本人的委派动作异步委派实行时的报告办法,如许他就不妨登时回去处事,而当处事被打分时,仍旧不妨接到报告:public void dowork() {...console.writeline("worker: work completed");if( completed != null ) {foreach( workcompleted wc in completed.getinvocationlist() ) {wc.begininvoke(new asynccallback(workgraded), wc);}}}private void workgraded(iasyncresult res) {workcompleted wc = (workcompleted)res.asyncstate;int grade = wc.endinvoke(res);console.writeline("worker grade= " + grade);}【译注:以次是上段步调输入截止worker: work starteduniverse notices worker starting workworker: work progressingworker: work completedmain: worker completed work //【译注:异步委派爆发了功效,所以这一条龙先输入啦】better...worker grade = 6universe pleased with worker's workworker grade = 7】完备究竟-----------peter、他的东家和universe最后大快人心,peter的东家和universe辨别控制她们各自感爱好的事变。这就减少了实行承担和不需要的往返挪用功夫。peter控制在发惹事件时报告与事变关系的实行者,并最后异步赢得截止,而尽管她们做出回应功夫的是非。然而,peter也深知这十足并不像表面看上去那么大略,由于当他异步激活一个事变,与该事变关系的实行因变量很大概是在另一个线程中实行,由此形成潜伏的安排处置题目。然而peter与mike是好伙伴,而mike则粗通线程题目的处置,他会为peter竭尽全力的。此刻十足ok!,对于peter的故事就讲到这边,即使大师感爱好的话,我再有很多故事要讲的!

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.