+ -
当前位置:首页 → 问答吧 → 异步调用什么时候结束

异步调用什么时候结束

时间:2011-12-05

来源:互联网

刚在研究异步调用问题, 有个问题不明请教大家:
主要代码为:通过网络发一个信息后, 异步接收返回信息. 
当执行回调函数时, 是否可以认为BeginReceive(....)执行结束? EndReceive有什么用?

void SendMessage()
{
......
  clientSocket.BeginReceive(recvBytes, 0, recvBytes.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
}

void ReceiveCallBack(IAsyncResult AR)
{
int REnd = clientSocket.EndReceive(AR);
string msg = Encoding.ASCII.GetString(recvBytes, 0, REnd);
......
}

作者: flu_ant   发布时间: 2011-12-05

EndXXX 是用来获得结果的。回调方法里用EndXXX 

Func<string, string> func = x =>  
{  
  // 模拟复杂的处理  
  Thread.Sleep(1000);  
  return x + " is completed";  
};  
func.BeginInvoke("some work", ir =>
{
AsyncResult ar = (AsyncResult)ir;
var delegateInstance = (Func<string, string>)ar.AsyncDelegate;
var result = delegateInstance.EndInvoke(ir);
Console.WriteLine(result);
}, null);

红色部分是回调,回调里用 EndInvoke(IAsyncResult) 获得结果

作者: fangxinggood   发布时间: 2011-12-05

颜色标的不对,重来:


func.BeginInvoke("some work", ir =>
{
AsyncResult ar = (AsyncResult)ir;
var delegateInstance = (Func<string, string>)ar.AsyncDelegate;
var result = delegateInstance.EndInvoke(ir);
Console.WriteLine(result);
}, null); 

作者: fangxinggood   发布时间: 2011-12-05

当执行回调函数时, 是否可以认为BeginReceive(....)执行结束? EndReceive有什么用?
---------------------------------------------------------------------
是的, EndReceive 是用来阻塞的来确保通信结束

作者: Sandy945   发布时间: 2011-12-06