ResponseRelation.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:ResponseRelation
  3. * 作者:xulisong
  4. * 创建时间: 2018/12/19 17:25:01
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Net.Http;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Timers;
  14. namespace Com.FirmLib
  15. {
  16. public class ResponseRelation
  17. {
  18. /// <summary>
  19. /// 枷锁对象
  20. /// </summary>
  21. private object m_Lock = new object();
  22. private List<ResponseRelation> Data{ get; set; }
  23. private Timer m_Timer;
  24. public ResponseRelation():this(false)
  25. {
  26. }
  27. public ResponseRelation(bool autoClear)
  28. {
  29. m_Timer = new Timer();
  30. Data = new List<ResponseRelation>();
  31. AutoClear = autoClear;
  32. }
  33. public bool AutoClear { get; set; }
  34. public void ClearNoAlived()
  35. {
  36. for (int i = Data.Count-1; i >-1; i--)
  37. {
  38. var relation = Data[i];
  39. if (!relation.Key.TryGetTarget(out Task<HttpResponseMessage> reference) || reference == null)
  40. {
  41. Data.RemoveAt(i);
  42. }
  43. }
  44. }
  45. public void Add(Task<HttpResponseMessage> tr, RequestInfo requestInfo)
  46. {
  47. Data.Add(new ResponseRelation(tr, requestInfo));
  48. if (Data.Count > 300)
  49. {
  50. ClearNoAlived();
  51. }
  52. }
  53. public RequestInfo GetValue(Task<HttpResponseMessage> tr)
  54. {
  55. RequestInfo result = null;
  56. for (int i = Data.Count - 1; i > -1; i--)
  57. {
  58. var relation = Data[i];
  59. if (!relation.Key.TryGetTarget(out Task<HttpResponseMessage> reference) || reference == null)
  60. {
  61. Data.RemoveAt(i);
  62. }
  63. else if(reference==tr)
  64. {
  65. result = relation.Value;
  66. }
  67. }
  68. return result;
  69. }
  70. public ResponseRelation(Task<HttpResponseMessage> tr, RequestInfo requestInfo)
  71. {
  72. Key = new WeakReference<Task<HttpResponseMessage>>(tr);
  73. Value = requestInfo;
  74. }
  75. public WeakReference<Task<HttpResponseMessage>> Key { get;private set; }
  76. public RequestInfo Value { get;private set; }
  77. }
  78. }