//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在RRQMCore.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/eo2w71/rrqm // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Threading; namespace RRQMCore.Run { /// /// 等待数据对象 /// /// public class WaitData : IDisposable { internal bool _dispose; private WaitDataStatus status; private AutoResetEvent waitHandle; private T waitResult; /// /// 构造函数 /// public WaitData() { this.waitHandle = new AutoResetEvent(false); } /// /// 析构函数 /// ~WaitData() { if (!this._dispose) { this.Dispose(); } } /// /// 状态 /// public WaitDataStatus Status { get => this.status; } /// /// 等待数据结果 /// public T WaitResult { get { return this.waitResult; } } /// /// 取消任务 /// public void Cancel() { this.status = WaitDataStatus.Canceled; this.waitHandle.Set(); } /// /// 回收 /// public void Dispose() { this.status = WaitDataStatus.Disposed; this._dispose = true; this.waitResult = default; this.waitHandle.Dispose(); } /// /// Reset /// public bool Reset() { this.status = WaitDataStatus.Default; this.waitResult = default; return this.waitHandle.Reset(); } /// /// 使等待的线程继续执行 /// public void Set() { this.status = WaitDataStatus.SetRunning; this.waitHandle.Set(); } /// /// 使等待的线程继续执行 /// /// 等待结果 public void Set(T waitResult) { this.waitResult = waitResult; this.status = WaitDataStatus.SetRunning; this.waitHandle.Set(); } /// /// 加载取消令箭 /// /// public void SetCancellationToken(CancellationToken cancellationToken) { if (cancellationToken.CanBeCanceled) { cancellationToken.Register(() => { this.Cancel(); }); } } /// /// 载入结果 /// public void SetResult(T result) { this.waitResult = result; } /// /// 等待指定毫秒 /// /// public WaitDataStatus Wait(int millisecond) { if (!this.waitHandle.WaitOne(millisecond)) { this.status = WaitDataStatus.Overtime; } return this.status; } } }