none
关于sokcet异步读取的一个疑问? RRS feed

  • 问题

  • bool willRaiseEvent = sock.ReceiveAsync(e);

    e是SocketAsyncEventArgs 异步套接字操作类型实例。

    现在我有一个疑问:

    在执行上面语句的时候,bool willRaiseEvent = sock.ReceiveAsync(e);

    当willRaiseEvent为true时,就说明执行异步操作,我需要等待,在completed事件中去获取操作的结果和数据。

    当willRaiseEvent为false是,就说明这个执行同步完成了,我可以不用等待到compled事件中去获取操作的结果和数据了。我只要在bool willRaiseEvent = sock.ReceiveAsync(e);语句后面对e进行操作就可以了。

    我这样的理解正确否?

    2010年4月28日 3:15

答案

全部回复

  • 是的,而且 completed 事件并不会被触发
    2010年4月28日 3:33
  • SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();

    connectArgs.UserToken = this.clientSocket;
    connectArgs.RemoteEndPoint = this.hostEndPoint;
    connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
    clientSocket.ConnectAsync(connectArgs);
    autoConnectEvent.WaitOne();

     

            private void OnConnect(object sender, SocketAsyncEventArgs e)
            {
                // 通知连接已经完成
                autoConnectEvent.Set();
                this.connected = (e.SocketError == SocketError.Success);
            }

    以前都是这样写的,那么是不是有点不妥呢?

     

    是否需要修改为:

    SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();

    connectArgs.UserToken = this.clientSocket;
    connectArgs.RemoteEndPoint = this.hostEndPoint;
    connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
    bool result = clientSocket.ConnectAsync(connectArgs);

    if(result == true){
    autoConnectEvent.WaitOne();}

    else{

    this.connected = (e.SocketError == SocketError.Success);}

            private void OnConnect(object sender, SocketAsyncEventArgs e)
            {
                // 通知连接已经完成
                autoConnectEvent.Set();
                this.connected = (e.SocketError == SocketError.Success);
            }

     

    2010年4月28日 3:42
  • 以下为个人观点,不保证正确

     

    如果单从是否通过的角度上说,没有问题,注意 result == false 的时候的处理就是了。

    但是我不赞成用 WaitOne()。 异步的最大好处就是让IO线程去做读写,而工作线程可以继续运行,接受更多的 IO 操作。

    现在 WaitOne 这么 block 一下。。。。变成工作线程在等待 IO线程了。。。异步还有啥意义。。

    2010年4月28日 8:47
  • WaitOne在我这里例子里确实是不用也可以,但是如果你要判断它的返回结果,那么waitone是肯定要的。

    我主要问的是:

    bool result = clientSocket.ConnectAsync(connectArgs);

    if(result == true){
    autoConnectEvent.WaitOne();}

    else{

    this.connected = (e.SocketError == SocketError.Success);}

            private void OnConnect(object sender, SocketAsyncEventArgs e)
            {
                // 通知连接已经完成
                autoConnectEvent.Set();
                this.connected = (e.SocketError == SocketError.Success);
            }

    这样的操作逻辑对不对的?

    2010年4月29日 1:17
  • 在线等。。。

    2010年4月29日 11:04
  • 你好 你的理解大致上是正確的

    當返回true說明I/O Pending了 那麼你可以通過e.Completed事件添加自己的處理函數 當異步完成后你就可以在自己的事件處理函數中進行相應的處理

    如果返回false 說明同步完成的 無須異步 這個時候你可以直接在sock.ReceiveAsync(e);代碼后通過e來獲取操作的結果和數據了


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~
    2010年4月30日 3:18
    版主
  • 恩。好的。谢谢大家。那我就按照我的理解写代码了。
    2010年4月30日 7:28
  • bool result = clientSocket.ConnectAsync(connectArgs);

    这个无论是真还是假,都是马上返回的,无非就是返回false的时候,你需要手动触发一下completed事件(即执行这个事件的操作,否则就漏掉了),waitone确实没啥必要(跟同步操作一样了),该知道的都已经知道了,之后的就让系统去做吧,我们只要等待结果就行了……


    霸王
    2010年5月1日 15:38
  • bool result = clientSocket.ConnectAsync(connectArgs);

    这个无论是真还是假,都是马上返回的,无非就是返回false的时候,你需要手动触发一下completed事件(即执行这个事件的操作,否则就漏掉了),waitone确实没啥必要(跟同步操作一样了),该知道的都已经知道了,之后的就让系统去做吧,我们只要等待结果就行了……


    霸王


    不明白你说的意思。

    我的意思是:

    如果返回true,就说明系统去异步执行调用了,所以我们要在compled事件中去取结果,如果返回为false,说明没有去异步执行调用,正确还是错误的结果我们马上可以在接来下的代码中connectArgs中捕获。

    2010年5月5日 0:55