欢迎来到天天文库
浏览记录
ID:9026474
大小:41.00 KB
页数:5页
时间:2018-04-15
《异步编程(asynccallback委托iasyncresult接口begininvoke方法endinvoke方法)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、让我们来看看同步异步的区别:同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作.NET框架基类库中有好几种类都可以提供同步和异步的方法调用。因为同步方法调用会导致程序流程中途等待,所以采用同步方法的情况下往往会导致程序执行的延迟相比来说,在某些条件下选择异步方法调用就可能更好一些例如,有的时候程序需要给多个Web服务发出请求,还有远程处理信道(HTTP、TCP)和代理,这时就最好采用异步方法.NETFramework允许异步调用任何方法,定义与需要调用的方法具有相同签名的委托CLR将自动为该委托
2、定义添加适当签名的BeginInvoke虚方法和EndInvoke虚方法和Invoke方法。关于委托的这3个方法的详细说明可以参考这文章http://www.cnblogs.com/aierong/archive/2005/05/25/162181.html我们先来了解这2个方法和一个委托和一个接口:(1)BeginInvoke方法可启动异步调用。它与您需要异步执行的方法具有相同的参数,另外它还有两个可选参数。第一个参数是一个AsyncCallback委托,该委托引用在异步调用完成时要调用的方法。第二个参数是一个用户定义的对象,该对象可向回调方法传递信息。BeginInvoke立即返
3、回,不等待异步调用完成。BeginInvoke会返回IAsyncResult,这个结果可用于监视异步调用进度。结果对象IAsyncResult是从开始操作返回的,并且可用于获取有关异步开始操作是否已完成的状态。结果对象被传递到结束操作,该操作返回调用的最终返回值。在开始操作中可以提供可选的回调。如果提供回调,在调用结束后,将调用该回调;并且回调中的代码可以调用结束操作。(2)EndInvoke方法检索异步调用的结果。调用BeginInvoke后可随时调用EndInvoke方法;如果异步调用尚未完成,EndInvoke将一直阻止调用线程,直到异步调用完成后才允许调用线程执行。EndIn
4、voke的参数包括您需要异步执行的方法的out和ref参数以及由BeginInvoke返回的IAsyncResult。(3)AsyncCallback委托用于指定在开始操作完成后应被调用的方法AsyncCallback委托被作为开始操作上的第二个到最后一个参数传递代码原型如下:[Serializable]publicdelegatevoidAsyncCallback(IAsyncResultar);AsyncCallback为客户端应用程序提供完成异步操作的方法。开始异步操作时,该回调委托被提供给客户端。AsyncCallback引用的事件处理程序包含完成客户端异步任务的程序逻辑。A
5、syncCallback使用IAsyncResult接口获取异步操作的状态。(4)IAsyncResult接口它表示异步操作的状态.该接口定义了4个公用属性代码原型如下:publicinterfaceIAsyncResult实际上,发起和完成.NET异步调用有4种方案可供你选择1.方案1-使用EndInvoke等待异步调用异步执行方法最简单的方式是通过调用委托的BeginInvoke方法来开始执行方法,在主线程上执行一些工作,然后调用委托的EndInvoke方法。EndInvoke可能会阻止调用线程,因为它直到异步调用完成之后才返回。这种技术非常适合文件或网络操作,但是由于EndIn
6、voke会阻止它,所以不要从服务于用户界面的线程中调用它。还是先来段自己喜欢的控制台代码:1usingSystem;23namespaceConsoleApplication14{5classClass16{7publicdelegatevoidAsyncEventHandler();89voidEvent1()10{11Console.WriteLine("Event1Start");12System.Threading.Thread.Sleep(2000);13Console.WriteLine("Event1End");14}1516voidEvent2()17{18Conso
7、le.WriteLine("Event2Start");19inti=1;20while(i<1000)21{22i=i+1;23Console.WriteLine("Event2"+i.ToString());24}25Console.WriteLine("Event2End");26}2728voidCallbackMethod(IAsyncResultar)29{30((AsyncEventHandler)ar.AsyncState).EndInvo
此文档下载收益归作者所有