• C#异步通信概念及应用主要向你介绍了C#异步通信的实现方法和操作的具体的实现方法,希望对你理解和学习C#异步通信有所帮助。
    1. C# Socket异步通讯实现详解
    2. C#异步编程模式IAsyncResult浅析
    3. 基于事件的C#异步编程模式浅析
    4. 对委托在C#异步委托和多线程中的理解
    5. C#异步委托之委托使用的时机浅析

    C#异步通信概念及应用的认识首先让我们来看看:在网络编程中运用Socket,常常需要长期监听某个端口,以获得Socket连接,进而执行相关操作。

    但此时,主线程就会被阻塞,无法做其他事情。为了解决这类问题,Socket类中提供了一些支持异步操作的方法,如表17-10所示。

    下表为Socket类中支持异步操作的方法

       

       

    BeginAccept()

    开始一个异步请求,以创建一个新的Socket对象来接受传入的连接请求

    EndAccept()

    结束一个异步请求,以创建一个新的Socket对象来接受传入的连接请求

    BeginConnect()

    开始一个对远程主机的异步请求

    EndConnect()

    结束一个对远程主机的异步请求

    BeginDisconnect()

    开始异步请求从远程主机断开连接

    EndDisconnect()

    结束从远程主机断开连接的异步请求

    BeginReceive()

    开始从连接的Socket中异步接收数据

    EndReceive()

    结束从连接的Socket中异步接收数据

    BeginReceiveFrom()

    开始从指定网络设备中异步接收数据

    EndReceiveFrom()

    结束从指定网络设备中异步接收数据

    BeginSend()

    开始将数据异步发送到连接的Socket

    EndSend()

    结束数据的异步发送

    BeginSendFile()

    开始将文件异步发送到连接的Socket

    EndSendFile()

    结束文件的异步发送

    BeginSendTo()

    向特定的远程主机异步发送数据

    EndSendTo()

    结束对远程主机数据的异步发送

    从上表中可以看出,这些方法都是成对出现的。这些方法能避免网络通信中的阻塞现象。这些方法的使用机制是在Begin开头的方法中注册一个回调函数,当对应的事件发生时,调用该回调函数,且在回调函数中调用对应的End开头的方法。

    下面以BeginAccept()和EndAccept()为例,说明异步方法的用法。BeginAccept()的声明如下所示。

    1. public IAsyncResult BeginAccept(AsynCallback callback,
    2. object state);

    其中,第一个参数是异步委托AsynCallb了ack,state包含此请求的状态信息的对象。

    EndAccept()方法具有三种重载形式,如下所示。

    1. public Socket EndAccept(IAsyncResult asynresult);
    2. public Socket EndAccept(out byte[] buffer,
    3. IAsyncResult asynresult);
    4. public Socket EndAccept(out byte[] buffer,
    5. out int bytesTransferred, IAsyncResult asynresult,);

    asynresult用于存储此异步操作的状态信息及任何用户定义的数据;buffer表示需要传输的字节数据;

    bytesTransferred表示已经传输的字节数。这里的out参数与ref的用法类似,均表示传递引用。它们的区别是ref是传递参数的地址,out是返回值。

    具体用法如下所示。

    1. private AsyncCallback callbackOnAccpt; //定制回调方法
    2. private Socket s;
    3. ……  //C#异步通信
    4. s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    5. callbackAccpt = new AsyncCallback(this.OnAccept);//实例化回调方法
    6. s.BeginAccept(callbackOnAccpt, this.s); //开始异步请求
    7. ……
    8. private void OnAccept(IAsyncResult asynresult)
    9. {
    10. //C#异步通信
    11. ……
    12. s.EndAccept(asynresult); //结束异步请求
    13. ……
    14. }

    BeginConnect()和EndConnect()用于对远程主机的异步连接请求。BeginConnect()的声明如下所示。

    1. public IAsyncResult BeginConnect(EndPoint remoteEP,
    2. AsyncCallback callback, object state);
    3. public IAsyncResult BeginConnect(IPAddress address,
    4. int port,AsyncCallback requestedcallback,object state);
    5. public IAsyncResult BeginConnect(IPAddress[] address,
    6. int port,AsyncCallback requestedcallback,object state);
    7. //C#异步通信
    8. public IAsyncResult BeginConnect(string host,int port,
    9. AsyncCallback requestedcallback,object state);

    它的每个重载形式均含有AsyncCallback参数,这是这类Begin开头的方法的特点;remoteEP表示远程主机的IP和端口。

    EndConnect()的声明如下所示。

    public Socket EndConnect(IAsyncResult asynresult);

    它的参数的意义和EndAccept()完全一致。

    BeginSend()表示开始将数据异步发送到连接的Socket,它最常用的声明如下所示。

    1. public IAsyncResult BeginSend(byte[] buffer,
    2. int offset,int size,SocketFlags socketFlags,
    3. AsyncCallback callback,object state);

    Buffer表示要发送的数据,offset表示buffer中发送数据的位置,size为发送字节数的大小,socketFlags指SocketFlags值的按位组合。

    EndSend()的声明如下所示。

    1. public Socket EndSend(IAsyncResult asynresult);

    BeginReceive()表示开始从连接的Socket中异步接收数据,它的常见声明如下所示。

    1. public IAsyncResult BeginReceive(byte[] buffer,
    2. int offset,int size,SocketFlags socketFlags,
    3. AsyncCallback callback,object state);

    它的参数和BeginSend()是完全一致的,这里不再赘述。

    EndReceive()的声明如下所示。

    1. public Socket EndReceive(IAsyncResult asynresult);

    C#异步通信之Socket中异步通信的实现要远比同步困难,这里不再举例。简单地说,在同步中,主线程如果调用一个方法,那么主线程必须等到方法线程执行完才能继续往下执行。因此,主线程和方法线程的执行是串行的。而在异步中,两者能同时执行,它们的执行是并行的。

    C#异步通信的相关内容就向你介绍到这里,希望对你了解和学习C#异步通信有所帮助。

C#异步通信概念及应用浅析 .相关推荐

  1. 基于Manim针对FT教学过程的一种可行性设计

    摘 要:傅里叶变换是信号频谱分析的重要工具,也是信号与系统课程中的核心概念与内容.由于其建立起了连续和离散.时域和频域之间完美的四对变换关系,也造成了其定义和形式上的冗杂.本文立足于课程中傅里叶变换的 ...

  2. csharp attributes

    ·         C# Attribute的概念与使用浅析 ·         http://developer.51cto.com  2009-09-11 11:16  佚名  百度空间  我要评 ...

  3. 牛客刷题笔记--(数组专项练习1-77)

    知识点 设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为(O(1)) 稀疏矩阵一般采用三元组顺序表方法压缩存储 数组作为函数参数传递的是数组的首地址 在二分查找中,如果剩下的子序列有 ...

  4. 微服务电商实战(九)注册接口(dto+jpa+mysql+redis)

    一.简介 本篇博客实现我们的注册接口. 流程如下: 1.会员服务提供接口--根据手机号码查询用户是否存在. 2.微信服务调用步骤1的接口,若手机号查询用户存在,则提示已注册:否则发送短信验证码,并将验 ...

  5. 获得无向图连通子图_讲透学烂二叉树(一):图的概念和定义—各种属性特征浅析...

    树和图的概念 图是一种特殊的数据结构,由点和边构成,它可以用来描述元素之间的网状关系,这个网状没有顺序,也没有层次,就是简单的把各个元素连接起来. 图的概念和基本性质 图(graph):图(graph ...

  6. 概念设计师凌云:《蜘蛛侠:平行宇宙》和《证人》美术浅析

    10月16日,由腾讯游戏学院举办的第三届TGDC(腾讯游戏开发者大会)在深圳举行.在大会的艺术分论坛中,<蜘蛛侠:平行宇宙>和<证人>的概念设计师凌云,首次将两款作品美术设计概 ...

  7. 工业大数据浅析(上篇)——工业大数据的概念、发展及价值

    目录 1.引言 2.工业大数据概念 3.工业大数据起源 4.各国工业大数据实践 4.1.德国的"工业4.0" 4.2.美国的"CPS和工业互联网" 4.3.日本 ...

  8. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)

    位置式PID与增量式PID区别浅析 Z小旋 2019-04-26 08:55:12  59882  收藏 713 分类专栏: NXP智能车学习 文章标签: 位置式PID PID 增量式PID 版权 1 ...

  9. SQL Server 中WITH (NOLOCK)浅析 2014-08-30 11:58 by 潇湘隐者, 58264 阅读, 33 评论, 收藏, 编辑 概念介绍 开发人员喜欢在SQL脚本

    SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同 ...

最新文章

  1. 基于容器的全链路运维平台实践
  2. Java 7之多线程- Semaphore--转载
  3. servlet容器_Servlet详解(一)之基本概念
  4. stm32编码器正反转计数程序_光电编码器接线图分析
  5. 汽车电子嵌入式技术篇(一) -CRC-8和CRC-16算法
  6. VS2013 使用QCustomPlot等三方库如何配置
  7. 数组转换为字符串方法
  8. 干货 | 大牛谈嵌入式C语言的高级用法
  9. curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
  10. 终于有人把tomcat讲清楚了。
  11. 【转】C#获取当前日期时间(转)
  12. 支持向量机回归_机器学习系列17:支持向量机
  13. vue $emit 父组件与子组件之间的通信(父组件向子组件传参)
  14. 微信APP支付开发指引
  15. Opencores 无法点击submit的问题解决方案
  16. 手游录像分享传播实战攻略——《钢琴大师》
  17. 动态规划背包问题之完全背包详解
  18. 笔记——衡量回归算法的标准最好的评价指标R Square
  19. 20sccm_SCCM 2016 使用PXE 部署操作系统(一)
  20. C# DataGridView数据导出Excel文件

热门文章

  1. 干货分享|安全测试起航之旅 1
  2. atitit.设计文档---操作日志的实现
  3. jQuery formValidator 表单校验插件4.1.1高仿网易邮箱注册页面(已发演示链接)
  4. 网络查找文档比自己电脑上还方便?
  5. 解读SSL ***技术(二)
  6. 分布式数据库clickhouse、tidb、palo对比
  7. 使用PostgREST的RestAPI操作PostgreSQL数据库教程
  8. 容器编排技术 -- 基于Docker本地运行Kubernetes
  9. [极客大挑战 2019]Havefun
  10. C#LeetCode刷题之#589-N叉树的前序遍历(N-ary Tree Preorder Traversal)