c#的异步socket回调是多线程回调,怎么处理的

在写一个unity的项目网络层,用c#的异步socket,BeginSend,EndSend,BeginReceive,EndReceive,但是发现回调的方式是多线程回调:
下面的代码我在回调的地方打印出线程id,发现不一样:
如果是多线程回调,那么收到数据recve回调的时候想要做包解析,必须要自己把这个事件丢到消息队列中放到网络层线程中去处理,这样又好麻烦,感觉这个异步的接口应该不会这么麻烦吧,怀疑是不是用错了。有没有遇到相同问题的,求教一下怎么处理的。

    /// 异步发送
    public void AsynSend()
    {
        if (m_socket == null) 
            return;
        //编码
        try
        {
            m_socket.BeginSend(m_sendBuffer, 0, m_sendPos, SocketFlags.None, asyncResult =>
            {
                //完成发送消息
                int bytes = m_socket.EndSend(asyncResult);
                if(bytes <= 0)
                {
                    Close();
                    return;
                }

                UnityEngine.Debug.LogWarning("send length:"+bytes);
                UnityEngine.Debug.LogWarning("current send thread:" + Thread.CurrentThread.ManagedThreadId);

                m_sendPos -= bytes;
            }, null);

        }
        catch (Exception ex)
        {
            Close();
            UnityEngine.Debug.LogWarning("异常信息:"+ ex.Message);
        }
    }

    //异步接受
    public void AsynRecive()
    {
        try
        {
            //开始接收数据
            m_socket.BeginReceive(m_recvBuffer, m_recvPos, m_recvBuffer.Length - m_recvPos, SocketFlags.None,
            asyncResult =>
            {
                int bytes = m_socket.EndReceive(asyncResult);

                UnityEngine.Debug.LogWarning("recv length:"+bytes);
                UnityEngine.Debug.LogWarning("current recv thread:" + Thread.CurrentThread.ManagedThreadId);

                AsynRecive();
                if (bytes <= 0)
                {
                    Close();
                    return;
                }
                m_recvPos += bytes;
                ParseProtocol();
            }, null);
        }
        catch (Exception ex)
        {
            Close();
            UnityEngine.Debug.LogWarning("异常信息:"+ex.Message);
        }
    }

2个回答

谢谢,我已经确认下这个接口是不是多线程回调,回调的时候做成事件丢到原来的线程队列中就行了,正常接收包都没问题。只是这个异步接口封装的让人有点恶心,应该把回调接口封装到同一个线程中的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐