yytfyl 2016-12-13 10:07 采纳率: 0%
浏览 3226

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条回答

  • dabocaiqq 2016-12-17 04:33
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题