NET委托:一个关于C#的睡前故事(3).docx

上传人:新** 文档编号:560910229 上传时间:2023-03-09 格式:DOCX 页数:7 大小:13.86KB
返回 下载 相关 举报
NET委托:一个关于C#的睡前故事(3).docx_第1页
第1页 / 共7页
NET委托:一个关于C#的睡前故事(3).docx_第2页
第2页 / 共7页
NET委托:一个关于C#的睡前故事(3).docx_第3页
第3页 / 共7页
NET委托:一个关于C#的睡前故事(3).docx_第4页
第4页 / 共7页
NET委托:一个关于C#的睡前故事(3).docx_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《NET委托:一个关于C#的睡前故事(3).docx》由会员分享,可在线阅读,更多相关《NET委托:一个关于C#的睡前故事(3).docx(7页珍藏版)》请在金锄头文库上搜索。

1、 NET委托:一个关于C#的睡前故事(3)if( pleted != null ) pleted(); 彼得不想让这些事发生,他意识到需要给每个托付供应“注册”和“反注册”功能,这样监听者就可以自己添加和移除托付,但同时又不能清空整个列表也不能随便激发彼得的大事了。彼得并没有来自己实现这些功能,相反,他使用了event关键字让C#编译器为他构建这些方法: class Worker .public event WorkStarted started;public event WorkProgressing progressing;public event WorkCompleted comple

2、ted; 彼得知道event关键字在托付的外边包装了一个property,仅让C#客户通过+= 和 -=*作符来添加和移除,强迫他的老板和宇宙正确地使用大事。 static void Main() Worker peter = new Worker();Boss boss = new Boss();pleted += new WorkCompleted(boss.WorkCompleted);peter.started += new WorkStarted(Universe.WorkerStartedWork);pleted += new WorkCompleted(Universe.Work

3、erCompletedWork);peter.DoWork(); Console.WriteLine(“Main: 工人工作完成”); Console.ReadLine(); “收获”全部结果 到这时,彼得最终可以送一口气了,他胜利地满意了全部监听者的需求,同时避开了与特定实现的紧耦合。但是他留意到他的老板和宇宙都为它的工作打了分,但是他仅仅接收了一个分数。面对多个监听者,他想要“收获”全部的结果,于是他深入到代理里面,轮询监听者列表,手工一个个调用: public void DoWork() .Console.WriteLine(“工作: 工作完成”“);if( completed != n

4、ull ) foreach( WorkCompleted wc in completed.GetInvocationList() ) int grade = wc();Console.WriteLine(“工人的工作得分” + grade); 异步通知:激发Console.WriteLine(“Better.“); return 6; /* 总分为10 */ class Universe static int WorkerCompletedWork() System.Threading.Thread.Sleep(4000);Console.WriteLine(“Universe is plea

5、sed with worker”s work“);return 7;. 很不幸,彼得每次通知一个监听者后必需等待它给自己打分,现在这些通知花费了他太多的工作大事。于是他打算忘掉分数,仅仅异步激发大事: public void DoWork() .Console.WriteLine(“工作: 工作完成”“);if( completed != null ) foreach( WorkCompleted wc in completed.GetInvocationList() )wc.BeginInvoke(null, null); 异步通知:轮询 这使得彼得可以通知他的监听者,然后马上返回工作,让进

6、程的线程池来调用这些代理。随着时间的过去,彼得发觉他丧失了他工作的反应,他知道听取别人的赞扬和努力工作一样重要,于是他异步激发大事,但是周期性地轮询,取得可用的分数。 public void DoWork() .Console.WriteLine(“工作: 工作完成”“);if( completed != null ) foreach( WorkCompleted wc in completed.GetInvocationList() ) IAsyncResult res = wc.BeginInvoke(null, null);while( !res.IsCompleted ) System

7、.Threading.Thread.Sleep(1);int grade = wc.EndInvoke(res);Console.WriteLine(“工人的工作得分” + grade); 异步通知:托付 不幸地,彼得有回到了一开头就想避开的状况中来,比方,老板站在背后盯着他工作。于是,他打算使用自己的托付作为他调用的异步托付完成的通知,让他自己马上回到工作,但是仍可以在别人给他的工作打分后得到通知: public void DoWork() .Console.WriteLine(“工作: 工作完成”“);if( completed != null ) foreach( WorkComplet

8、ed 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(“工人的工作得分” + grade); 宇宙中的幸福 彼得、他的老板和宇宙最终都满意了。彼得的老板和宇宙可以收到他们感兴趣的大事通知,削减了实现的负担和非必需的来回“差旅费”。彼得可以通知他们,而不管他们要花多长时间来从目的方法中返回,同时又可以异步地得到他的结果。彼得知道,这并不*非常*简洁,由于当他异步激发大事时,方法要在另外一个线程中执行,彼得的目的方法完成的通知也是一样的道理。但是,迈克和彼得是好朋友,他很熟识线程的事情,可以在这个领域供应指导。 他们永久幸福地生活下去

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号