//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Collections.Concurrent; using System.Threading; namespace TouchSocket.Core { /// /// 等待处理数据 /// /// public class WaitHandlePool : DisposableObject where T : IWaitResult { private readonly ConcurrentDictionary> m_waitDic; private readonly ConcurrentQueue> m_waitQueue; /// /// 构造函数 /// public WaitHandlePool() { m_waitDic = new ConcurrentDictionary>(); m_waitQueue = new ConcurrentQueue>(); } /// /// 销毁 /// /// public void Destroy(WaitData waitData) { if (waitData.DisposedValue) { return; } if (m_waitDic.TryRemove(waitData.WaitResult.Sign, out _)) { waitData.Reset(); m_waitQueue.Enqueue(waitData); } } /// /// /// /// protected override void Dispose(bool disposing) { foreach (var item in m_waitDic.Values) { item.SafeDispose(); } foreach (var item in m_waitQueue) { item.SafeDispose(); } m_waitDic.Clear(); m_waitQueue.Clear(); base.Dispose(disposing); } /// /// 取消全部 /// public void CancelAll() { foreach (var item in m_waitDic.Values) { item.Cancel(); } } /// /// 延迟模式 /// public bool DelayModel { get; set; } = false; private long m_waitCount; private long m_waitReverseCount; /// /// 获取一个可等待对象 /// /// /// 设置为false时,不会生成sign /// public WaitData GetWaitData(T result, bool autoSign = true) { if (m_waitQueue.TryDequeue(out var waitData)) { if (autoSign) { result.Sign = Interlocked.Increment(ref m_waitCount); } waitData.SetResult(result); m_waitDic.TryAdd(result.Sign, waitData); return waitData; } waitData = new WaitData(); waitData.DelayModel = DelayModel; if (autoSign) { result.Sign = Interlocked.Increment(ref m_waitCount); } waitData.SetResult(result); m_waitDic.TryAdd(result.Sign, waitData); return waitData; } /// /// 获取一个Sign为负数的可等待对象 /// /// /// 设置为false时,不会生成sign /// public WaitData GetReverseWaitData(T result, bool autoSign = true) { if (m_waitQueue.TryDequeue(out var waitData)) { if (autoSign) { result.Sign = Interlocked.Decrement(ref m_waitReverseCount); } waitData.SetResult(result); m_waitDic.TryAdd(result.Sign, waitData); return waitData; } waitData = new WaitData(); waitData.DelayModel = DelayModel; if (autoSign) { result.Sign = Interlocked.Decrement(ref m_waitReverseCount); } waitData.SetResult(result); m_waitDic.TryAdd(result.Sign, waitData); return waitData; } /// /// 让等待对象恢复运行 /// /// public void SetRun(long sign) { if (m_waitDic.TryGetValue(sign, out WaitData waitData)) { waitData.Set(); } } /// /// 让等待对象恢复运行 /// /// /// public void SetRun(long sign, T waitResult) { if (m_waitDic.TryGetValue(sign, out WaitData waitData)) { waitData.Set(waitResult); } } /// /// 让等待对象恢复运行 /// /// public void SetRun(T waitResult) { if (m_waitDic.TryGetValue(waitResult.Sign, out WaitData waitData)) { waitData.Set(waitResult); } } } }