Socket类中提供的支持异步操作的方法2011-04-06在网络编程中运用Socket,常常需要长期监听某个端口,以获得Socket连接,进而执行相关操作。但此时,主线程就会被阻塞,无法做其他事情。为了解决这类问题,Socket类中提供了一些支持异步操作的方法,如表17-10所示。表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是返回值。