using System.Collections.Generic; using System.Net; using System.Threading.Tasks; namespace ETModel { public class LockInfo { public IPEndPoint Address; public TaskCompletionSource Tcs; public LockInfo(IPEndPoint address, TaskCompletionSource tcs) { this.Address = address; this.Tcs = tcs; } } public class MasterComponent : Component { /// 镜像的地址 private readonly List ghostsAddress = new List(); /// 当前获取锁的进程地址 private IPEndPoint lockedAddress; /// 请求锁的队列 private readonly Queue queue = new Queue(); public void AddGhost(IPEndPoint address) { this.ghostsAddress.Add(address); } public void RemoveGhost(IPEndPoint address) { this.ghostsAddress.Remove(address); } public Task Lock(IPEndPoint address) { if (this.lockedAddress == null) { this.lockedAddress = address; return Task.FromResult(true); } TaskCompletionSource tcs = new TaskCompletionSource(); LockInfo lockInfo = new LockInfo(address, tcs); this.queue.Enqueue(lockInfo); return tcs.Task; } public void Release(IPEndPoint address) { if (!this.lockedAddress.Equals(address)) { Log.Error($"解锁地址与锁地址不匹配! {this.lockedAddress} {address}"); return; } if (this.queue.Count == 0) { this.lockedAddress = null; return; } LockInfo lockInfo = this.queue.Dequeue(); this.lockedAddress = lockInfo.Address; lockInfo.Tcs.SetResult(true); } } }