欢迎来到天天文库
浏览记录
ID:33957196
大小:43.50 KB
页数:7页
时间:2019-03-02
《c#event中委托和方法的异步调用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、http://hi.baidu.com/smithallen/blog/item/43c7b71abf2ce4f1af51330b.htmlc#event中委托和方法的异步调用2009-12-2214:23通常情况下,如果需要异步执行一个耗时的操作,我们会新起一个线程,然后让这个线程去执行代码。但是对于每一个异步调用都通过创建线程来进行操作显然会对性能产生一定的影响,同时操作也相对繁琐一些。.Net中可以通过委托进行方法的异步调用,就是说客户端在异步调用方法时,本身并不会因为方法的调用而中断,而是从线程池中抓取一个线
2、程去执行该方法,自身线程(主线程)在完成抓取线程这一过程之后,继续执行下面的代码,这样就实现了代码的并行执行。使用线程池的好处就是避免了频繁进行异步调用时创建、销毁线程的开销。如同上面所示,当我们在委托对象上调用BeginInvoke()时,便进行了一个异步的方法调用。上面的例子中是在事件的发布和订阅这一过程中使用了异步调用,而在事件发布者和订阅者之间往往是松耦合的,发布者通常不需要获得订阅者方法执行的情况;而当使用异步调用时,更多情况下是为了提升系统的性能,而并非专用于事件的发布和订阅这一编程模型。而在这种情况下使
3、用异步编程时,就需要进行更多的控制,比如当异步执行方法的方法结束时通知客户端、返回异步执行方法的返回值等。本节就对BeginInvoke()方法、EndInvoke()方法和其相关的IAysncResult做一个简单的介绍。NOTE:注意此处我已经不再使用发布者、订阅者这些术语,因为我们不再是讨论上面的事件模型,而是讨论在客户端程序中异步地调用方法,这里有一个思维的转变。我们看这样一段代码,它演示了不使用异步调用的通常情况:classProgram7{ staticvoidMain(string[]args){
4、 Console.WriteLine("Clientapplicationstarted!"); Thread.CurrentThread.Name="MainThread"; Calculatorcal=newCalculator(); intresult=cal.Add(2,5); Console.WriteLine("Result:{0}",result); //做某些其它的事情,模拟需要执行3秒钟 for(inti
5、=1;i<=3;i++){ Thread.Sleep(TimeSpan.FromSeconds(i)); Console.WriteLine("{0}:Clientexecuted{1}second(s).", Thread.CurrentThread.Name,i); } Console.WriteLine("Pressanykeytoexit..."); Console.ReadKey(); }}publi
6、cclassCalculator{ publicintAdd(intx,inty){ if(Thread.CurrentThread.IsThreadPoolThread){ Thread.CurrentThread.Name="PoolThread"; } Console.WriteLine("Methodinvoked!"); //执行某些事情,模拟需要执行2秒钟 for(inti=1;i<=2;i++){
7、 Thread.Sleep(TimeSpan.FromSeconds(i)); Console.WriteLine("{0}:Addexecuted{1}second(s).", Thread.CurrentThread.Name,i); } Console.WriteLine("Methodcomplete!"); returnx+y; }}上面代码有几个关于对于线程的操作,如果不了解可以看一下下面的说明,如果你
8、已经了解可以直接跳过:·Thread.Sleep(),它会让执行当前代码的线程暂停一段时间(如果你对线程的概念比较陌生,可以理解为使程序的执行暂停一段时间),以毫秒为单位,比如Thread.Sleep(1000),将会使线程暂停1秒钟。在上面我使用了它的重载方法,个人觉得使用TimeSpan.FromSeconds(1),可读性更好一些。·Th
此文档下载收益归作者所有