[+] Implementation SendAndRegister

[+] Implementation SendAndRegister
This commit is contained in:
ALEXTANG
2023-04-21 13:41:28 +08:00
parent b791c1a44d
commit 663c1342f7
2 changed files with 37 additions and 26 deletions

View File

@@ -120,7 +120,8 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="msgId">网络消息包id。</param> /// <param name="msgId">网络消息包id。</param>
/// <param name="msgDelegate">要注册的网络消息包处理函数。</param> /// <param name="msgDelegate">要注册的网络消息包处理函数。</param>
void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate); /// <param name="checkRepeat">是否检测重复。</param>
void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate, bool checkRepeat = false);
/// <summary> /// <summary>
/// 移除网络消息包处理函数。 /// 移除网络消息包处理函数。
@@ -168,10 +169,10 @@ namespace TEngine
/// 向远程主机发送消息包并注册消息回调。 /// 向远程主机发送消息包并注册消息回调。
/// </summary> /// </summary>
/// <typeparam name="T">消息包类型。</typeparam> /// <typeparam name="T">消息包类型。</typeparam>
/// <param name="pack">要发送的消息包。</param> /// <param name="packet">要发送的消息包。</param>
/// <param name="resHandler">要注册的回调。</param> /// <param name="resHandler">要注册的回调。</param>
/// <param name="needShowWaitUI">是否需要等待UI。</param> /// <param name="needShowWaitUI">是否需要等待UI。</param>
/// <returns>消息包是否发送成功。</returns> /// <returns>消息包是否发送成功。</returns>
bool Send<T>(T pack, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet; bool Send<T>(T packet, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet;
} }
} }

View File

@@ -231,28 +231,35 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="msgId">网络消息包id。</param> /// <param name="msgId">网络消息包id。</param>
/// <param name="msgDelegate">要注册的网络消息包处理函数。</param> /// <param name="msgDelegate">要注册的网络消息包处理函数。</param>
public void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate) /// <param name="checkRepeat">是否检测重复。</param>
public void RegisterMsgHandler(int msgId, CsMsgDelegate msgDelegate,bool checkRepeat = true)
{ {
if (msgDelegate == null) if (msgDelegate == null)
{ {
throw new GameFrameworkException("Msg handler is invalid."); throw new GameFrameworkException("Msg handler is invalid.");
} }
if (!_msgHandlerMap.TryGetValue(msgId, out var listHandle)) lock (_msgHandlerMap)
{ {
listHandle = new List<CsMsgDelegate>(); if (!_msgHandlerMap.TryGetValue(msgId, out var listHandle))
_msgHandlerMap[msgId] = listHandle;
}
if (listHandle != null)
{
if (!listHandle.Contains(msgDelegate))
{ {
listHandle.Add(msgDelegate); listHandle = new List<CsMsgDelegate>();
_msgHandlerMap[msgId] = listHandle;
} }
else
if (listHandle != null)
{ {
Log.Error("-------------repeat RegCmdHandle MsgId:{0}-----------",msgId); if (!listHandle.Contains(msgDelegate))
{
listHandle.Add(msgDelegate);
}
else
{
if (checkRepeat)
{
Log.Error("-------------repeat RegCmdHandle MsgId:{0}-----------",msgId);
}
}
} }
} }
} }
@@ -264,14 +271,17 @@ namespace TEngine
/// <param name="msgDelegate">要注册的网络消息包处理函数。</param> /// <param name="msgDelegate">要注册的网络消息包处理函数。</param>
public void RemoveMsgHandler(int msgId, CsMsgDelegate msgDelegate) public void RemoveMsgHandler(int msgId, CsMsgDelegate msgDelegate)
{ {
if (!_msgHandlerMap.TryGetValue(msgId, out List<CsMsgDelegate> listHandle)) lock (_msgHandlerMap)
{ {
return; if (!_msgHandlerMap.TryGetValue(msgId, out List<CsMsgDelegate> listHandle))
} {
return;
}
if (listHandle != null) if (listHandle != null)
{ {
listHandle.Remove(msgDelegate); listHandle.Remove(msgDelegate);
}
} }
} }
@@ -452,14 +462,14 @@ namespace TEngine
/// 向远程主机发送消息包并注册消息回调。 /// 向远程主机发送消息包并注册消息回调。
/// </summary> /// </summary>
/// <typeparam name="T">消息包类型。</typeparam> /// <typeparam name="T">消息包类型。</typeparam>
/// <param name="pack">要发送的消息包。</param> /// <param name="packet">要发送的消息包。</param>
/// <param name="resHandler">要注册的回调。</param> /// <param name="resHandler">要注册的回调。</param>
/// <param name="needShowWaitUI">是否需要等待UI。</param> /// <param name="needShowWaitUI">是否需要等待UI。</param>
/// <returns>消息包是否发送成功。</returns> /// <returns>消息包是否发送成功。</returns>
public bool Send<T>(T pack, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet public bool Send<T>(T packet, CsMsgDelegate resHandler, bool needShowWaitUI = false) where T : Packet
{ {
//TODO RegisterMsgHandler(packet.Id,resHandler,false);
return true; return Send(packet);
} }
/// <summary> /// <summary>