cevent中委托和方法的异步调用.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
cevent中委托和方法的异步调用

/smithallen/blog/item/43c7b71abf2ce4f1af51330b.html c# event中 委托和方法的异步调用 2009-12-22 14:23 通常情况下,如果需要异步执行一个耗时的操作,我们会新起一个线程,然后让这个线程去执行代码。但是对于每一个异步调用都通过创建线程来进行操作显然会对性能产生一定的影响,同时操作也相对繁琐一些。.Net中可以通过委托进行方法的异步调用,就是说客户端在异步调用方法时,本身并不会因为方法的调用而中断,而是从线程池中抓取一个线程去执行该方法,自身线程(主线程)在完成抓取线程这一过程之后,继续执行下面的代码,这样就实现了代码的并行执行。使用线程池的好处就是避免了频繁进行异步调用时创建、销毁线程的开销。 如同上面所示,当我们在委托对象上调用BeginInvoke()时,便进行了一个异步的方法调用。上面的例子中是在事件的发布和订阅这一过程中使用了异步调用,而在事件发布者和订阅者之间往往是松耦合的,发布者通常不需要获得订阅者方法执行的情况;而当使用异步调用时,更多情况下是为了提升系统的性能,而并非专用于事件的发布和订阅这一编程模型。而在这种情况下使用异步编程时,就需要进行更多的控制,比如当异步执行方法的方法结束时通知客户端、返回异步执行方法的返回值等。本节就对BeginInvoke()方法、EndInvoke()方法和其相关的IAysncResult做一个简单的介绍。 NOTE:注意此处我已经不再使用发布者、订阅者这些术语,因为我们不再是讨论上面的事件模型,而是讨论在客户端程序中异步地调用方法,这里有一个思维的转变。 我们看这样一段代码,它演示了不使用异步调用的通常情况: class Program7 { ??? static void Main(string[] args) { ??????? Console.WriteLine(Client application started! ); ??????? Thread.CurrentThread.Name = Main Thread; ??????? Calculator cal = new Calculator(); ??????? int result = cal.Add(2, 5); ??????? Console.WriteLine(Result: {0} , result); ??????? ??????? // 做某些其它的事情,模拟需要执行3秒钟 ??????? for (int i = 1; i = 3; i++) { ??????????? Thread.Sleep(TimeSpan.FromSeconds(i)); ??????????? Console.WriteLine({0}: Client executed {1} second(s)., ??????????????? Thread.CurrentThread.Name, i); ??????? } ??????? Console.WriteLine( Press any key to exit...); ??????? Console.ReadKey(); ??? } } public class Calculator { ??? public int Add(int x, int y) { ??????? if (Thread.CurrentThread.IsThreadPoolThread) { ??????????? Thread.CurrentThread.Name = Pool Thread; ??????? } ??????? Console.WriteLine(Method invoked!);?????????? ??????? // 执行某些事情,模拟需要执行2秒钟 ??????? for (int i = 1; i = 2; i++) { ??????????? Thread.Sleep(TimeSpan.FromSeconds(i)); ??????????? Console.WriteLine({0}: Add executed {1} second(s)., ??????????????? Thread.CurrentThread.Name, i); ??????? } ??????? Console.WriteLine(Method complete!); ??????? return x + y; ??? } } 上面代码有几个关于对于线程的操作,如果不了解可以看一下下面的说明,如果你已经了解可以直接跳过: Thread.Sleep(),它会让执行当前代码的线程暂停一段时间(如果你对线

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档