2019独角兽企业重金招聘Python工程师标准>>>

摘自《C#网络应用编程》(第2版)
看到网上资料很少,做个摘录,如有版权问题,请告知。

利用TcpListener类和TcpClient类在同步方式下接收、发送数据以及监听客户端连接时,在操作没有完成之前一直处于阻塞状态,这种同步TCP编程模式在开启的前台线程不太多的情况下是比较合适的。但是,如果开启的前台线程较多,系统的性能就会受到影响。这种情况下,最好的办法是使用异步操作。

实际上,在大型的应用系统中,多数都采用异步工作方式,因此希望读者尽可能掌握本节的主要设计思想,为编写复杂的网络应用程序打好基础。

5.4.1 异步设计模式概述

所谓异步操作方式,就是我们希望让某个工作开始以后能在这个工作尚未完成的时候继续处理其他工作。异步操作一般在单独的线程中进行,调用异步方法异步执行某个操作时,可同时继续执行该异步方法后面的代码。

使用异步操作方式编写程序就是异步编程。

异步编程有两种模式,一种是基于事件的异步设计模式,另一种是基于IAsyncResult的异步设计模式。基于事件的异步设计模式封装了异步编程的复杂度,简化了异步设计的难度,理解起来比较直观。基于IAsyncResult的异步设计模式提供了更灵活的控制功能,但实现代码理解起来相对困难一些。

1、基于事件的异步设计模式

    基于事件的异步设计模式用事件驱动模型实现异步方法,这种模式用单独的线程在后台执行耗时的任务,当后台任务完成时,就自动触发对应的事件。该模式既具有多线程应用程序的优点,同时也隐匿了多线程设计中固有的许多复杂问题。BackgroundWorker组件就是用这种模式提供的对异步操作封装后的、适用于一般异步设计的组件,利用它可以完成绝大多数异步设计任务,而不需要考虑复杂的异步操作细节。除此之外,还有其他的控件和组件也提供了基于事件的异步设计模式,如PictureBox控件等。

编写不太复杂的异步操作的应用程序时,建议尽量使用基于事件的异步设计模式。因为它能有效的提高项目开发效率和质量,同时也降低了异步编程的复杂度。

2、基于IAsyncResult的异步设计模式

    TcpListenerTcpClient除了提供同步模式下对应的方法,还为基于IAsyncResult的异步设计模式提供了对应的方法,以便为程序员提供更加灵活的异步编程支持。

(1)基本原理。基于IAsyncResult的异步设计模式通过前缀分别为“Begin”和“End”的两个方法实现开始和结束异步操作,每个Begin方法都必须有一个与其对应的End方法,如BeginAcceptTcpClientEndAcceptTcpClient方法等。程序在调用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编程(一)相关推荐

  1. 异步tcp通信——APM.Core 服务端概述

    为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...

  2. 【RDMA】RDMA编程和TCP编程的区别|bRPC

    目录 RDMA RDMA和TCP编程差别 Socket API Verbs API 百度bRPC RDMA网卡和传统网卡对比说明 bandaoyu,本文随时更新:https://blog.csdn.n ...

  3. C语言网络编程:TCP编程模型

    编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...

  4. TCP编程函数和步骤

    TCP编程的服务器端一般步骤是 1. 创建一个socket,用函数socket(): 2. 设置socket属性,用函数setsockopt(); * 可选 3. 绑定IP地址.端口等信息到socke ...

  5. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  6. angular之Rxjs异步数据流编程入门

    Rxjs介绍 参考手册:https://www.npmjs.com/package/rxjs 中文手册:https://cn.rx.js.org/ RxJS 是 ReactiveX 编程理念的 Jav ...

  7. Boost:基于Boost的异步TCP回显服务器

    Boost:基于Boost的异步TCP回显服务器 实现功能 C++实现代码 实现功能 基于Boost的异步TCP回显服务器 C++实现代码 #include <cstdlib> #incl ...

  8. Python tcp编程,TCP服务端和TCP客户端代码编写

    Python网络编程 两种模式: 一种tcp可靠连接,能够保证数据不丢失 一种udp 不关心数据是否会丢失,在乎传输效率 TCP编程 一点:服务端 二点:客户端 客户端如何连接服务端,保证传输的数据可 ...

  9. socket网络编程——TCP编程流程及端口号占用问题

    1.TCP编程流程 1.1TCP服务器端客户端及方法介绍 TCP 提供的是面向连接的.可靠的.字节流服务.TCP 的服务器端和客户端编程流程如下: socket()方法是用来创建一个套接字,有了套接字 ...

最新文章

  1. linux的core文件认识
  2. php寻找文本,PHP文本数据库的搜索方法_php
  3. 第二节:如何正确使用WebApi和使用过程中的一些坑
  4. 推荐四格漫画:勇者、魔族、龙族
  5. python机器学习案例系列教程——最小生成树(MST)的Prim算法和Kruskal算法
  6. spring session spring:session:sessions:expires 源码跟踪
  7. python小白逆袭大佬_Python小白逆袭大神心得
  8. 电流反馈和电压反馈的判断
  9. 电脑和打印机怎么连接
  10. 微信小程序框架(四)-全面详解(学习总结---从入门到深化)
  11. 使用CrawlSpider爬取糗事百科段子
  12. 代驾APP_第一章_项目环境搭建_第一节
  13. rm: cannot remove `d': Read-only file system解决过程
  14. 2.6. 字符类型与字符编码
  15. excel表在html显示图片,html背景图片不显示!如何在Excel里插入背景图片?背景图片可以打印出来吗?...
  16. svn的一些错误提示
  17. Autoware的MPC源码解析(五)mpc_follower解析:calculateMPC()函数解析
  18. 2021-08-02 CentOS7.9 启动telnet服务
  19. 黑马程序员------毕老师视频笔记第22天------图形化编程(2)
  20. 第三圣谛:灭谛——苦的止息

热门文章

  1. Docker镜像基本使用
  2. POJ1988(带权并查集,搬砖块)
  3. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 查找子弹数据的动态地址 | 查找子弹数据的静态地址 | 静态地址分析 | 完整流程 ) ★
  4. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
  5. 【计算理论】图灵机 ( 非确定性图灵机 -> 确定性图灵机 | 模仿过程示例 | 算法的数学模型 )
  6. 【计算机网络】应用层 : 电子邮件 ( SMTP 协议 | MIME 协议 | POP3 协议 | IMAP 协议 | 基于万维网的电子邮件 )
  7. 【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
  8. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
  9. 【Java 网络编程】TCP 服务器端 客户端 简单示例
  10. Nike Barkley Foamposite Max “Rayguns”