知识大全 一个关于C#的睡前故事[3]

Posted 彼得

篇首语:三人行必有我师焉;择其善者而从之,其不善者而改之。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 一个关于C#的睡前故事[3]相关的知识,希望对你有一定的参考价值。

NET委托:一个关于C#的睡前故事[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    事件 不幸的是 宇宙太忙了 也不习惯时刻关注它里面的个体 它可以用自己的委托替换了彼得老板的委托 这是把彼得的Worker类的的委托字段做成public的一个无意识的副作用 同样 如果彼得的老板不耐烦了 也可以决定自己来激发彼得的委托(真是一个粗鲁的老板) // Peter s boss taking matters into his own handsif( peter pleted != null ) peter pleted();   彼得不想让这些事发生 他意识到需要给每个委托提供 注册 和 反注册 功能 这样监听者就可以自己添加和移除委托 但同时又不能清空整个列表也不能随意激发彼得的事件了 彼得并没有来自己实现这些功能 相反 他使用了event关键字让C#编译器为他构建这些方法 class Worker    public event WorkStarted started; public event WorkProgressing progressing; public event WorkCompleted pleted;   彼得知道event关键字在委托的外边包装了一个property 仅让C#客户通过+= 和 =操作符来添加和移除 强迫他的老板和宇宙正确地使用事件 static void Main()  Worker peter = new Worker(); Boss boss = new Boss(); peter pleted += new WorkCompleted(boss WorkCompleted); peter started += new WorkStarted(Universe WorkerStartedWork); peter pleted += new WorkCompleted(Universe WorkerCompletedWork); peter DoWork(); Console WriteLine( Main: 工人工作完成 ); Console ReadLine();    收获 所有结果  到这时 彼得终于可以送一口气了 他成功地满足了所有监听者的需求 同时避免了与特定实现的紧耦合 但是他注意到他的老板和宇宙都为它的工作打了分 但是他仅仅接收了一个分数 面对多个监听者 他想要 收获 所有的结果 于是他深入到代理里面 轮询监听者列表 手工一个个调用 public void DoWork()    Console WriteLine( 工作: 工作完成 ); if( pleted != null )   foreach( WorkCompleted wc in pleted GetInvocationList() )    int grade = wc();   Console WriteLine( 工人的工作得分= + grade);      异步通知 激发 & 忘掉  同时 他的老板和宇宙还要忙于处理其他事情 也就是说他们给彼得打分所花费的事件变得非常长 class Boss  public int WorkCompleted()   System Threading Thread Sleep( );  Console WriteLine( Better ); return ; /* 总分为 */ class Universe  static int WorkerCompletedWork()   System Threading Thread Sleep( );  Console WriteLine( Universe is pleased with worker s work );  return ;     很不幸 彼得每次通知一个监听者后必须等待它给自己打分 现在这些通知花费了他太多的工作事件 于是他决定忘掉分数 仅仅异步激发事件 public void DoWork()    Console WriteLine( 工作: 工作完成 ); if( pleted != null )   foreach( WorkCompleted wc in pleted GetInvocationList() )     wc BeginInvoke(null null);      异步通知 轮询  这使得彼得可以通知他的监听者 然后立即返回工作 让进程的线程池来调用这些代理 随着时间的过去 彼得发现他丢失了他工作的反馈 他知道听取别人的赞扬和努力工作一样重要 于是他异步激发事件 但是周期性地轮询 取得可用的分数 public void DoWork()    Console WriteLine( 工作: 工作完成 ); if( pleted != null )   foreach( WorkCompleted wc in pleted GetInvocationList() )    IAsyncResult res = wc BeginInvoke(null null);   while( !res IsCompleted ) System Threading Thread Sleep( );    int grade = wc EndInvoke(res);    Console WriteLine( 工人的工作得分= + grade);      异步通知 委托  不幸地 彼得有回到了一开始就想避免的情况中来 比如 老板站在背后盯着他工作 于是 他决定使用自己的委托作为他调用的异步委托完成的通知 让他自己立即回到工作 但是仍可以在别人给他的工作打分后得到通知 public void DoWork()    Console WriteLine( 工作: 工作完成 ); if( pleted != null )   foreach( WorkCompleted wc in pleted GetInvocationList() )    wc BeginInvoke(new AsyncCallback(WorkGraded) wc);   private void WorkGraded(IAsyncResult res)  WorkCompleted wc = (WorkCompleted)res AsyncState; int grade = wc EndInvoke(res); Console WriteLine( 工人的工作得分= + grade);

  宇宙中的幸福  彼得 他的老板和宇宙最终都满足了 彼得的老板和宇宙可以收到他们感兴趣的事件通知 减少了实现的负担和非必需的往返 差旅费 彼得可以通知他们 而不管他们要花多长时间来从目的方法中返回 同时又可以异步地得到他的结果 彼得知道 这并不*十分*简单 因为当他异步激发事件时 方法要在另外一个线程中执行 彼得的目的方法完成的通知也是一样的道理 但是 迈克和彼得是好朋友 他很熟悉线程的事情 可以在这个领域提供指导   他们永远幸福地生活下去……

cha138/Article/program/net/201311/15528

相关参考

知识大全 一个关于C#的睡前故事[1]

NET委托:一个关于C#的睡前故事[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 求一个关于诚信的小故事

求一个关于诚信的小故事2001年高考语文全国卷的作文就引了这个故事开头。记得这样一则耐人寻味的寓言:一位自认为经过漫长人生跋涉取得了成功的年轻人,身背“健康”、“美貌”、“诚信”、“机敏”、“才学”、

知识大全 求一个关于贪心的寓言故事

求一个关于贪心的寓言故事渔夫捕鱼 有一个渔夫贪图省事,织的网只有一张桌子那么大。他出海一天也没有捕到一条鱼,垂头丧气地回到了家。邻居对他说:“你织的网太小了,哪里能捕到鱼,还是把网织得大一点再出海捕鱼

知识大全 求一个关于兔子的爱情小故事 感人小故事 都可以 最好能是原创

求一个关于兔子的爱情小故事感人小故事都可以最好能是原创最近的这一片山坡来了一群羊,慢慢的把整片山的青草都啃光了。小兔帅帅来到美美的家里,看着消瘦了一圈的美美,原本红色的眼睛更红了;“跟我来吧”帅帅说,

知识大全 请帮我找一个英文故事~关于一对朋友在沙漠中,其中一个朋友打了另一个一巴掌

请帮我找一个英文故事~关于一对朋友在沙漠中,其中一个朋友打了另一个一巴掌Twofriendswerewalkingthroughthedesert.Duringsomepointofthejourne

知识大全 急求一个关于普通话的故事,大概50字,不要太多

急求一个关于普通话的故事,大概50字,不要太多普通话的故事我坐火车去唐山,对面一位十七八岁的小姑娘跟我用普通话交谈,她说她是丰南人,上北京看姐姐去了。我奇怪地问她:“你是丰南人?怎么说话没有丰南的口音

知识大全 《三国演义》《水浒传》《西游记》里关于一个三的故事,分别写出一个

《三国演义》《水浒传》《西游记》里关于一个三的故事,分别写出一个三国:三英战吕布水浒:三打祝家庄西游:三打白骨精《水浒传》中可写武大郎的痴情《西游记》可写唐僧和女儿国的国王因为各自的人生任务没能在一起

知识大全 我是小导游作文450字去长城内含一个关于长城的故事

我是小导游作文450字去长城内含一个关于长城的故事大家好!欢迎您来到长城游玩,希望我们的服务能让您多一份欢乐,也希望您能玩得开心,玩得尽兴,玩得满足.接下来,我先向诸位介绍一下长城的概况.长城位于北京

知识大全 关于c#静态方法和实例方法的辨析和应用

  本文将围绕c#静态方法和实例方法讨论一下针对一些观点如静态方法是常驻内存还有静态方法比实例方法先装载做一个辨析同时讨论下何时用静态方法何时用实例方法  前几日在微软的好友发给我一个链接《静态方法和

知识大全 关于长征小故事

关于长征小故事长征故事第一个:《金色的鱼钩》一九四五年秋天,红军进入了草地。由于三个小同志得了肠胃病的关系,所以指导员就让炊事班长照顾他们。三个病号一天走了二十里路,到了宿营地,班长就到处挖草根,和着