在写一个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);
}
}