Incoming.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Edge.Core.Parser;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace Edge.Core.Processor
  9. {
  10. public class Incoming<TMessage> : IDisposable, IIncoming<TMessage> where TMessage : MessageBase
  11. {
  12. private DateTime? lastMessageReceivedTime;
  13. private int eventTimeout;
  14. private System.Timers.Timer eventTimer;
  15. private bool longTimeNoSeeEventFired = false;
  16. private TMessage message;
  17. public event EventHandler OnMessageIncoming;
  18. public event EventHandler OnLongTimeNoSeeMessage;
  19. public bool DisablePropagate { get; set; }
  20. public virtual TMessage Message
  21. {
  22. get { return this.message; }
  23. set
  24. {
  25. this.message = value;
  26. this.lastMessageReceivedTime = DateTime.Now;
  27. this.longTimeNoSeeEventFired = false;
  28. var safe = this.OnMessageIncoming;
  29. safe?.Invoke(this, null);
  30. }
  31. }
  32. public int LongTimeNoSeeMessageTimeout
  33. {
  34. get { return this.eventTimeout; }
  35. set
  36. {
  37. this.eventTimeout = value;
  38. this.eventTimer?.Stop();
  39. if (this.eventTimeout > 0)
  40. {
  41. //may set to lower to gain more accuracy.
  42. this.eventTimer = new System.Timers.Timer(500);
  43. this.eventTimer.Elapsed += (_, __) =>
  44. {
  45. if (DateTime.Now.Subtract(this.lastMessageReceivedTime ?? DateTime.Now).TotalMilliseconds
  46. >= this.eventTimeout)
  47. {
  48. if (!this.longTimeNoSeeEventFired)
  49. {
  50. this.longTimeNoSeeEventFired = true;
  51. this.OnLongTimeNoSeeMessage?.Invoke(this, null);
  52. }
  53. }
  54. };
  55. this.eventTimer.Start();
  56. }
  57. }
  58. }
  59. public void Dispose()
  60. {
  61. this.eventTimer?.Stop();
  62. }
  63. }
  64. }