我眼中委托的真正面貌(三)
2009-05-14 08:28:38 来源:WEB开发网BeginInvoke()方法以异步方式开启目标方法,也就是说,其在调用之后会立即返回,即使是执行时间相当长的目标方法对于BeginInvoke()而言也不会带来任何的阻塞。如果是依靠委托来执行耗时相当长的方法,并且我们不急于得到方法的返回值(亦或是操控其他对象的效果)或者我们根本就不用得到方法的返回值,则以这种异步方式来执行无疑是最合适的。
EndInvoke()方法是与BeginInvoke()方法配对执行的,用于检索调用结果。相对前者而言,如果异步调用的方法尚未执行完毕,则EndInvoke()将一直遭到阻塞,直至异步方法执行完毕。其传入参数为调用BeginInvoke()时返回的IAsyncResult型对象。
有关BeginInvoke()、EndInvoke()方法,以及IAsyncResult接口对象的详细用法everx朋友在他的随笔中进行了较为全面的阐述,在这里为大家推荐一下:
异步委托的用法
我们再来看上述代码。Main()方法的第二句以异步方式执行委托方法,方法则在刚开始执行时被迫暂停5秒,然而,执行时我们会发现"委托方法执行中...."这句话几乎是在程序开始的瞬间就被显示出来了。这说明,BeginInvoke()在执行后是马上返回的,并未遭到任何的阻塞。在这之后,我们将Main()方法同样暂停5秒,而后以EndInvoke()获得委托方法的返回效果:"委托方法调用成功!"。这样,我们实现了委托的异步调用。
大家发现了吗?这种异步委托机制和C#中的多线程机制有异曲同工之妙!而事实上,在相应的目标方法中看线程号和主线程确实是不一样的。不过,在查阅了相关的一些资料之后,我还是得知了其中的一些细微的差别。这里推荐给大家一篇来自Kuffy Wang朋友的文章:
异步委托与多线程的区别
更多精彩
赞助商链接