异步调用什么时候结束

问题描述

刚在研究异步调用问题,有个问题不明请教大家:主要代码为:通过网络发一个信息后,异步接收返回信息.当执行回调函数时,是否可以认为BeginReceive(....)执行结束?EndReceive有什么用?voidSendMessage(){......clientSocket.BeginReceive(recvBytes,0,recvBytes.Length,SocketFlags.None,newAsyncCallback(ReceiveCallBack),null);}voidReceiveCallBack(IAsyncResultAR){intREnd=clientSocket.EndReceive(AR);stringmsg=Encoding.ASCII.GetString(recvBytes,0,REnd);......}

解决方案

解决方案二:
EndXXX是用来获得结果的。回调方法里用EndXXXFunc<string,string>func=x=>{//模拟复杂的处理Thread.Sleep(1000);returnx+"iscompleted";};func.BeginInvoke("somework",ir=>{AsyncResultar=(AsyncResult)ir;vardelegateInstance=(Func<string,string>)ar.AsyncDelegate;varresult=delegateInstance.EndInvoke(ir);Console.WriteLine(result);},null);红色部分是回调,回调里用EndInvoke(IAsyncResult)获得结果
解决方案三:
颜色标的不对,重来:func.BeginInvoke("somework",ir=>{AsyncResultar=(AsyncResult)ir;vardelegateInstance=(Func<string,string>)ar.AsyncDelegate;varresult=delegateInstance.EndInvoke(ir);Console.WriteLine(result);},null);
解决方案四:
当执行回调函数时,是否可以认为BeginReceive(....)执行结束?EndReceive有什么用?---------------------------------------------------------------------是的,EndReceive是用来阻塞的来确保通信结束
解决方案五:
EndReceive有没有都无所谓,只是一个任务结束通知而已,对于异步的执行过程起不了任何作用。就好比TextChanged事件,只是一个通知,告诉你文本变化了,而对于是否让他变化,无法控制。就算你不调用BeginReceive,照样会执行完成,只是收不到结束通知而已。根据我自己的经验,作用不大,用IAsyncResult来循环判断是否结束。IAsyncResultresult=task.BeginInvoke(...);while(!result.IsCompleted){//waiting......}

解决方案六:
纠正:“就算你不调用BeginReceive”改为“就算你不调用EndReceive”

时间: 2024-07-29 11:38:46

异步调用什么时候结束的相关文章

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

关于webservice的异步调用实例

web|异步 关于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明.这是一个webservice     _    Public Function delCurTable(ByVal tbName As String) As Boolean        Try            Return True        Catch ex As Exc

VB.NET中使用代表对方法异步调用

异步 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? 目录 为什么要使用异步调用实现异步调用的步骤和机理 为什么要使用异步调用(Asynchronous Method Execution) 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然

异步调用Web服务

web|web服务|异步 //////////////////////////////////////////////////////////////////////////////////Author: stardicky ////E-mail: stardicky@hotmail.com ////QQNumber: 9531511 ////CompanyName: Ezone International ////Class: HBS-0308 ////title: 异步调用Web服务 ///

关于webservice的异步调用简单实例

web|异步 关于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明.这是一个webservice <WebMethod(Description:="试验")> _ Public Function delCurTable(ByVal tbName As String) As Boolean Try Return True Catch

asp.net C# 异步调用的处理方法

A.   用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数.    B.   而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke.此种方法,是在回调函数中调用EndInvoke的.      异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了. 一个最简单的异步调用  代码如下

【转】Zookeeper-Watcher机制与异步调用原理

Watcher机制:目的是为ZK客户端操作提供一种类似于异步获得数据的操作.   1)在创建Zookeeper实例时,允许接收一个watcher参数,此参数将会赋值给watchMnanger.defaultWatcher,成为当前客户端的默认Watcher.需要注意此watcher和其他watcher不同,此wather主要是响应"与链接状态转换"有关的事件(比如,"建立链接","链接关闭"等,参见KeeperState).此默认watcher有

C#:Func的同步、异步调用

实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法:  1 public class MyMath 2 { 3 4 public int Add(int a, int b) 5 { 6 System.Threading.Thread.Sleep(5000); 7 return a + b; 8 } 9 10 } 对Add方法做下封装,对了对比,同时提供"同步调用"与&qu