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()的声明如下所示。
- public IAsyncResult BeginAccept(AsynCallback callback,
 - object state);
 
其中,***个参数是异步委托AsynCallb了ack,state包含此请求的状态信息的对象。
EndAccept()方法具有三种重载形式,如下所示。
- public Socket EndAccept(IAsyncResult asynresult);
 - public Socket EndAccept(out byte[] buffer,
 - IAsyncResult asynresult);
 - public Socket EndAccept(out byte[] buffer,
 - out int bytesTransferred, IAsyncResult asynresult,);
 
asynresult用于存储此异步操作的状态信息及任何用户定义的数据;buffer表示需要传输的字节数据;
bytesTransferred表示已经传输的字节数。这里的out参数与ref的用法类似,均表示传递引用。它们的区别是ref是传递参数的地址,out是返回值。
具体用法如下所示。
- private AsyncCallback callbackOnAccpt; //定制回调方法
 - private Socket s;
 - …… //C#异步通信
 - s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
 - callbackAccpt = new AsyncCallback(this.OnAccept);//实例化回调方法
 - s.BeginAccept(callbackOnAccpt, this.s); //开始异步请求
 - ……
 - private void OnAccept(IAsyncResult asynresult)
 - {
 - //C#异步通信
 - ……
 - s.EndAccept(asynresult); //结束异步请求
 - ……
 - }
 
BeginConnect()和EndConnect()用于对远程主机的异步连接请求。BeginConnect()的声明如下所示。
- public IAsyncResult BeginConnect(EndPoint remoteEP,
 - AsyncCallback callback, object state);
 - public IAsyncResult BeginConnect(IPAddress address,
 - int port,AsyncCallback requestedcallback,object state);
 - public IAsyncResult BeginConnect(IPAddress[] address,
 - int port,AsyncCallback requestedcallback,object state);
 - //C#异步通信
 - public IAsyncResult BeginConnect(string host,int port,
 - AsyncCallback requestedcallback,object state);
 
它的每个重载形式均含有AsyncCallback参数,这是这类Begin开头的方法的特点;remoteEP表示远程主机的IP和端口。
EndConnect()的声明如下所示。
public Socket EndConnect(IAsyncResult asynresult);
它的参数的意义和EndAccept()完全一致。
BeginSend()表示开始将数据异步发送到连接的Socket,它最常用的声明如下所示。
- public IAsyncResult BeginSend(byte[] buffer,
 - int offset,int size,SocketFlags socketFlags,
 - AsyncCallback callback,object state);
 
Buffer表示要发送的数据,offset表示buffer中发送数据的位置,size为发送字节数的大小,socketFlags指SocketFlags值的按位组合。
EndSend()的声明如下所示。
- public Socket EndSend(IAsyncResult asynresult);
 
BeginReceive()表示开始从连接的Socket中异步接收数据,它的常见声明如下所示。
- public IAsyncResult BeginReceive(byte[] buffer,
 - int offset,int size,SocketFlags socketFlags,
 - AsyncCallback callback,object state);
 
它的参数和BeginSend()是完全一致的,这里不再赘述。
EndReceive()的声明如下所示。
- public Socket EndReceive(IAsyncResult asynresult);
 
C#异步通信之Socket中异步通信的实现要远比同步困难,这里不再举例。简单地说,在同步中,主线程如果调用一个方法,那么主线程必须等到方法线程执行完才能继续往下执行。因此,主线程和方法线程的执行是串行的。而在异步中,两者能同时执行,它们的执行是并行的。
C#异步通信的相关内容就向你介绍到这里,希望对你了解和学习C#异步通信有所帮助。
                当前名称:C#异步通信概念及应用浅析
                
                本文路径:http://www.csdahua.cn/qtweb/news13/325563.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网