MsgContextCache.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Collections.Generic;
  3. using XGame.Framework.Interfaces;
  4. namespace XGame.Framework.Network
  5. {
  6. public class MsgContextCache : IReset, IDisposable
  7. {
  8. private Dictionary<int, MsgContextInfo> _mapContext = new Dictionary<int, MsgContextInfo>();
  9. public void Push(int instanceID, int protocol, object context)
  10. {
  11. MsgContextInfo info = ObjectPool.Acquire<MsgContextInfo>();
  12. info.protocolID = protocol;
  13. info.context = context;
  14. _mapContext[instanceID] = info;
  15. }
  16. public bool Pop(int instanceID, out int protocol, out object context)
  17. {
  18. if (_mapContext.TryGetValue(instanceID, out MsgContextInfo info))
  19. {
  20. _mapContext.Remove(instanceID);
  21. protocol = info.protocolID;
  22. context = info.context;
  23. ObjectPool.Recycle(info);
  24. return true;
  25. }
  26. protocol = 0;
  27. context = null;
  28. return false;
  29. }
  30. public void Reset()
  31. {
  32. foreach (var item in _mapContext)
  33. {
  34. ObjectPool.Recycle(item.Value);
  35. }
  36. _mapContext.Clear();
  37. }
  38. //public void CheckRecv(IMessage message)
  39. //{
  40. // if (message is IMsgPush)
  41. // {
  42. // var args = ObjectPool.Acquire<SessionPushRecvdEventArgs>();
  43. // args.protocolID = message.ProtocolID;
  44. // args.PushMsg = message;
  45. // node.Notify(EventDefine.SESSION_PUSH_RECVED, args);
  46. // ObjectPool.Recycle(args);
  47. // }
  48. // else
  49. // {
  50. // var args = ObjectPool.Acquire<SessionResponseRecvdEventArgs>();
  51. // args.protocolID = message.ProtocolID;
  52. // args.context = message.Context;
  53. // args.seq = message.InstanceID;
  54. // args.ResponseMsg = message;
  55. // if (LastID == message.InstanceID)
  56. // {
  57. // CanSend = true;
  58. // args.IsFilter = true;
  59. // }
  60. // else
  61. // {
  62. // args.IsFilter = false;
  63. // }
  64. // node.Notify(EventDefine.SESSION_RESPONSE_RECVED, args);
  65. // ObjectPool.Recycle(args);
  66. // }
  67. //}
  68. public void Dispose()
  69. {
  70. Reset();
  71. }
  72. public class MsgContextInfo : IReference
  73. {
  74. public int protocolID;
  75. public object context;
  76. public void Clear()
  77. {
  78. protocolID = 0;
  79. context = null;
  80. }
  81. }
  82. }
  83. }