5.4 异步TCP编程(一)
2019独角兽企业重金招聘Python工程师标准>>>
摘自《C#网络应用编程》(第2版)
看到网上资料很少,做个摘录,如有版权问题,请告知。
利用TcpListener类和TcpClient类在同步方式下接收、发送数据以及监听客户端连接时,在操作没有完成之前一直处于阻塞状态,这种同步TCP编程模式在开启的前台线程不太多的情况下是比较合适的。但是,如果开启的前台线程较多,系统的性能就会受到影响。这种情况下,最好的办法是使用异步操作。
实际上,在大型的应用系统中,多数都采用异步工作方式,因此希望读者尽可能掌握本节的主要设计思想,为编写复杂的网络应用程序打好基础。
5.4.1 异步设计模式概述
所谓异步操作方式,就是我们希望让某个工作开始以后能在这个工作尚未完成的时候继续处理其他工作。异步操作一般在单独的线程中进行,调用异步方法异步执行某个操作时,可同时继续执行该异步方法后面的代码。
使用异步操作方式编写程序就是异步编程。
异步编程有两种模式,一种是基于事件的异步设计模式,另一种是基于IAsyncResult的异步设计模式。基于事件的异步设计模式封装了异步编程的复杂度,简化了异步设计的难度,理解起来比较直观。基于IAsyncResult的异步设计模式提供了更灵活的控制功能,但实现代码理解起来相对困难一些。
1、基于事件的异步设计模式
基于事件的异步设计模式用事件驱动模型实现异步方法,这种模式用单独的线程在后台执行耗时的任务,当后台任务完成时,就自动触发对应的事件。该模式既具有多线程应用程序的优点,同时也隐匿了多线程设计中固有的许多复杂问题。BackgroundWorker组件就是用这种模式提供的对异步操作封装后的、适用于一般异步设计的组件,利用它可以完成绝大多数异步设计任务,而不需要考虑复杂的异步操作细节。除此之外,还有其他的控件和组件也提供了基于事件的异步设计模式,如PictureBox控件等。
编写不太复杂的异步操作的应用程序时,建议尽量使用基于事件的异步设计模式。因为它能有效的提高项目开发效率和质量,同时也降低了异步编程的复杂度。
2、基于IAsyncResult的异步设计模式
TcpListener和TcpClient除了提供同步模式下对应的方法,还为基于IAsyncResult的异步设计模式提供了对应的方法,以便为程序员提供更加灵活的异步编程支持。
(1)基本原理。基于IAsyncResult的异步设计模式通过前缀分别为“Begin”和“End”的两个方法实现开始和结束异步操作,每个Begin方法都必须有一个与其对应的End方法,如BeginAcceptTcpClient和EndAcceptTcpClient方法等。程序在调用Begin方法后,调用该方法的线程会继续执行其下面的语句,同时该方法用另一个单独的线程执行异步操作,当异步操作完成后,会返回一个实现IAsyncResult接口的对象,该对象存储了有关异步操作的信息。这些信息包括以下内容。
AsyncState:包含异步操作需要的状态信息,如果不需要状态信息,可以将此设置为null。
AsyncWaitHandle:用于在异步操作完成前阻止程序执行。
CompletedSynchronously:指示异步操作是否在用于调用Begin前缀的线程上完成,而不是在单独的ThreadPool线程上完成。
IsCompleted:一个布尔值,指示异步操作是否已完成。
调用Begin方法后,程序还应该调用End方法来结束异步操作。
(2)AsyncCallback委托。AsyncCallback委托用于在异步操作完成时调用指定的回调方法。在基于IAsyncResult的异步操作方式下,由于程序可以在启动异步操作后继续执行其他代码,因此必须有一种机制,以保证该异步操作完成时能及时通知调用者。AsyncCallback委托就是为实现这种机制而提供的。
回调方法是在程序中事先定义的,在回调方法中,通过End方法获取Begin方法的返回值和所有输入/输出参数,从而达到在异步操作方式下完成参数传递的目的。
但是,由于基于IAsyncResult的异步设计模式控制同步问题非常麻烦,而且代码难以理解。在实际设计中,一般不使用AsyncCallback委托处理异步操作的结果,而是利用轮询方式来判断异步操作是否完成。
具体实现思路为:调用Begin方法得到IAsyncResult对象,再循环判断该对象的IsCompleted属性,来决定异步操作是否完成。在这种情况下,将Begin方法的AsyncCallback参数设置为null即可。
在本章后面的异步编程例子中,我们还会学习具体设计方法。
转载于:https://my.oschina.net/zhangjinfu/blog/65375
5.4 异步TCP编程(一)相关推荐
- 异步tcp通信——APM.Core 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
- 【RDMA】RDMA编程和TCP编程的区别|bRPC
目录 RDMA RDMA和TCP编程差别 Socket API Verbs API 百度bRPC RDMA网卡和传统网卡对比说明 bandaoyu,本文随时更新:https://blog.csdn.n ...
- C语言网络编程:TCP编程模型
编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...
- TCP编程函数和步骤
TCP编程的服务器端一般步骤是 1. 创建一个socket,用函数socket(): 2. 设置socket属性,用函数setsockopt(); * 可选 3. 绑定IP地址.端口等信息到socke ...
- Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...
- angular之Rxjs异步数据流编程入门
Rxjs介绍 参考手册:https://www.npmjs.com/package/rxjs 中文手册:https://cn.rx.js.org/ RxJS 是 ReactiveX 编程理念的 Jav ...
- Boost:基于Boost的异步TCP回显服务器
Boost:基于Boost的异步TCP回显服务器 实现功能 C++实现代码 实现功能 基于Boost的异步TCP回显服务器 C++实现代码 #include <cstdlib> #incl ...
- Python tcp编程,TCP服务端和TCP客户端代码编写
Python网络编程 两种模式: 一种tcp可靠连接,能够保证数据不丢失 一种udp 不关心数据是否会丢失,在乎传输效率 TCP编程 一点:服务端 二点:客户端 客户端如何连接服务端,保证传输的数据可 ...
- socket网络编程——TCP编程流程及端口号占用问题
1.TCP编程流程 1.1TCP服务器端客户端及方法介绍 TCP 提供的是面向连接的.可靠的.字节流服务.TCP 的服务器端和客户端编程流程如下: socket()方法是用来创建一个套接字,有了套接字 ...
最新文章
- 关于“托管代码”和“非托管代码”
- 在“软件工程:研究与实践”研讨会上关于UML Use-Case的开放空间讨论
- SQLite 日期 时间
- linux下改变文件的字符编码
- Form Template Method(塑造模板函数)
- 在Workstation 14中导入vCenter Server Appliance 6.5
- 智伴机器人广西团队_{智伴AI机器人}陈涛广西南宁防城港城市合伙人-人工智能下一个风口精准蓝...
- mysql 多线程并行复制_【MySQL】开启并行复制
- python图片顶端_用python进行图片整理
- 部署中遇到的问题(四)
- f-admin——基于Laravel框架开发的基础权限后台系统
- 《信号与系统》(吴京)部分课后习题答案与解析——第二章(PART1)
- BioPython安装与入门
- PS图层蒙版应用——图片抠字
- 测试窗体的FormBorderStyle属性,不同属性所对应的窗体边框显示情况
- 从程序员到CTO的Java技术路线图(转)
- 使用Python来模拟鼠标的点击; 模拟键盘
- 关于网站推广 网站营销 建议
- flutter 如何实现虚线框按钮
- Bokeh Graph
热门文章
- Spring MVC_HandlerInterceptorAdapter的使用
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C
- 计算机网络第六章:应用层
- 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )
- 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )
- 【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )
- jar - 操作jar包的工具
- CCF 201703-3 Markdown
- 写了一个开源的ASP.Net的系统信息探针(适用于MS.Net 1.x/2.0和Mono 1.0/2.0)
- OpenGL中的reshape函数(整理)