前面关于socket的编程,全部是基于同步机制开发的服务器和客户端,线程会进入阻塞或者挂起状态,降低线程利用率,同时程序影响效率。因此,向tcp程序引入异步回调:在异步套接字完成网络操作后,线程没有被阻塞或者挂起,接着通过调用回调函数处理后续网络操作。而主线程继续执行,以实现并行执行的结果。
为什么要引入异步机制?
看到过一个解释。当我们打开一个程序时,鼠标不停地转但是就是不见界面跳转,这是其他耗时操作阻碍了ui线程,造成ui线程不能响应用户操作。如果引用异步机制,ui线程在发起耗时操作之后马上回来响应用户操作,把能响应的都给用户,最后等耗时操作结束,通过回调来处理耗时操作的结果。这就是异步机制能快速响应用户界面,还有更高的伸缩性(线程池更加灵活分配利用数量有限的线程)
什么是回调函数?为什么要用回调函数?
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调常常是异步调用的基础,即回调用于通知机制。具体看http://www.cnblogs.com/swordzj/archive/2007/04/24/2034769.html。委托就是C++的函数指针,即回调机制;就是Java的监听器:所有提供功能待植入的机制都要用到它。
异步回调代码例子如下:
sever.BeginAccept(new AsyncCallBack(Accept),server);//server是一个Socket对象
void Accept(IAsyncResult iar)
{
Socket oldserver=(Socket)iar.AsycState;
service=oldserver.EndAccept(iar);
}
从代码看出,其实异步回调就是把回调函数Accept的函数地址以及函数要用到的信息的对象通知给BeginAccept,告诉BeginAccept当你执行结束的时候只要有这两样东西给我,你就能委托系统就能用我(Accept),而异步就体现在BeginAccept和委托函数AsyncCallBack
有了前面的基础概念,就可以开始开发基于tcp的异步通信程序了。由于程序有界面还有数据通信,并且通信获得的数据要显示在界面上,所以应该选用回调机制来实现,它需要多线程、委托、异步调用等概念。
原文:https://blog.csdn.net/yuyin86/article/details/7765882
原文地址:https://www.cnblogs.com/jiangyu0331/p/12000724.html