MasterComponent.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Collections.Generic;
  2. using System.Net;
  3. using System.Threading.Tasks;
  4. namespace ETModel
  5. {
  6. public class LockInfo
  7. {
  8. public IPEndPoint Address;
  9. public TaskCompletionSource<bool> Tcs;
  10. public LockInfo(IPEndPoint address, TaskCompletionSource<bool> tcs)
  11. {
  12. this.Address = address;
  13. this.Tcs = tcs;
  14. }
  15. }
  16. public class MasterComponent : Component
  17. {
  18. /// 镜像的地址
  19. private readonly List<IPEndPoint> ghostsAddress = new List<IPEndPoint>();
  20. /// 当前获取锁的进程地址
  21. private IPEndPoint lockedAddress;
  22. /// 请求锁的队列
  23. private readonly Queue<LockInfo> queue = new Queue<LockInfo>();
  24. public void AddGhost(IPEndPoint address)
  25. {
  26. this.ghostsAddress.Add(address);
  27. }
  28. public void RemoveGhost(IPEndPoint address)
  29. {
  30. this.ghostsAddress.Remove(address);
  31. }
  32. public Task<bool> Lock(IPEndPoint address)
  33. {
  34. if (this.lockedAddress == null)
  35. {
  36. this.lockedAddress = address;
  37. return Task.FromResult(true);
  38. }
  39. TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
  40. LockInfo lockInfo = new LockInfo(address, tcs);
  41. this.queue.Enqueue(lockInfo);
  42. return tcs.Task;
  43. }
  44. public void Release(IPEndPoint address)
  45. {
  46. if (!this.lockedAddress.Equals(address))
  47. {
  48. Log.Error($"解锁地址与锁地址不匹配! {this.lockedAddress} {address}");
  49. return;
  50. }
  51. if (this.queue.Count == 0)
  52. {
  53. this.lockedAddress = null;
  54. return;
  55. }
  56. LockInfo lockInfo = this.queue.Dequeue();
  57. this.lockedAddress = lockInfo.Address;
  58. lockInfo.Tcs.SetResult(true);
  59. }
  60. }
  61. }