MasterComponent.cs 1.5 KB

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