SOCKET Communication writen in C# (5) Socket 异步操作 模式

SOCKET Communication writen in C# (5) Socket  异步操作 模式

 异步调用CallBack的示例

http://msdn.microsoft.com/zh-cn/library/5zwkzwf4.aspx

 

以Socket..::.BeginSend

   Socket EndSend

                                         方法为例子来说明

 

1.调用 BeginSend 的方法将使您能够在单独的执行线程中发送数据。

2.state 参数,则可以创建一个小型类或结构,用于保存 Socket 和其他所需的信息。通过 state 参数将此类的一个实例传递给 BeginSend 方法。

public class StateObject
{
    // Client socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 256;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

 

 

 

3.系统将使用一个单独的线程来执行指定的回调方法,并阻止 EndSend,直到 Socket 发送了请求的字节数或引发了异常为止

 

4.异步操作的一种模式,分两种情况.

往往我在调用完BeginSend方法之后,方法立即返回,则当前执行线程可以做一些其它的事情,但是如果调用BeginSend后要使当前线程暂停等待,则一般使用WaitHandle..::.WaitOne 方法.

  当需要它继续执行时候调用 T:System.Threading.ManualResetEvent 的 Set 方法

 

   使用异步操作自己的同步机制:

                    a.可以通过调用 result.AsyncWaitHandle.WaitOne(); 方法进行等待异步操作完成。    

                    b.经过测试,当异步调用完成后比如BeginSend,会自动发出 WaitHandle 信号,不需要手动发送,同时这也和EndInoke无关,我将EndInvoke注释掉,一样自动发出了WaitHandle信号; 具体可以去看看

http://msdn.microsoft.com/zh-cn/library/system.iasyncresult.aspx 代码

 

    使用手动同步对象ManualResetEvent

                     a) System.Threading.ManualResetEvent ManualSign = new System.Threading.ManualResetEvent(false);

                      b) 在需要等待的地方curr.ManualSign.WaitOne();

                     c) 异步完成或回调中手动发送信号this.ManualSign.Set();

    则完成

           

5.可以看到实际上,在某些情况下你可以不用调用EndInvoke方法,除非你需要获得返回内容或了解其异步操作的状态或者想要阻塞当前线程直到异步完成或是发生异常,保证正确完成了异步处理.

 

 

      后面将说明 异步操作的原理和自己实现线程池的方式

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值