问题描述
刚在研究异步调用问题,有个问题不明请教大家:主要代码为:通过网络发一个信息后,异步接收返回信息.当执行回调函数时,是否可以认为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”