//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在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.Threading; using System.Threading.Tasks; namespace TouchSocket.Core { /// /// 等待数据对象 /// /// public class WaitData : DisposableObject { private readonly AutoResetEvent m_waitHandle; private WaitDataStatus m_status; private T m_waitResult; /// /// 构造函数 /// public WaitData() { m_waitHandle = new AutoResetEvent(false); } /// /// 延迟模式 /// public bool DelayModel { get; set; } /// /// 状态 /// public WaitDataStatus Status => m_status; /// /// 等待数据结果 /// public T WaitResult => m_waitResult; /// /// 取消任务 /// public void Cancel() { m_status = WaitDataStatus.Canceled; if (!DelayModel) { m_waitHandle.Set(); } } /// /// Reset。 /// 设置为null。然后重置状态为,waitHandle.Reset() /// public bool Reset() { m_status = WaitDataStatus.Default; m_waitResult = default; if (!DelayModel) { return m_waitHandle.Reset(); } return true; } /// /// 使等待的线程继续执行 /// public bool Set() { m_status = WaitDataStatus.SetRunning; if (!DelayModel) { return m_waitHandle.Set(); } return true; } /// /// 使等待的线程继续执行 /// /// 等待结果 public bool Set(T waitResult) { m_waitResult = waitResult; m_status = WaitDataStatus.SetRunning; if (!DelayModel) { return m_waitHandle.Set(); } return true; } /// /// 加载取消令箭 /// /// public void SetCancellationToken(CancellationToken cancellationToken) { if (cancellationToken.CanBeCanceled) { cancellationToken.Register(Cancel); } } /// /// 载入结果 /// public void SetResult(T result) { m_waitResult = result; } /// /// 等待指定时间 /// /// public WaitDataStatus Wait(TimeSpan timeSpan) { return this.Wait((int)timeSpan.TotalMilliseconds); } /// /// 等待指定毫秒 /// /// public WaitDataStatus Wait(int millisecond) { if (DelayModel) { for (int i = 0; i < millisecond / 10.0; i++) { if (m_status != WaitDataStatus.Default) { return m_status; } Task.Delay(10).GetAwaiter().GetResult(); } m_status = WaitDataStatus.Overtime; return m_status; } else { if (!m_waitHandle.WaitOne(millisecond)) { m_status = WaitDataStatus.Overtime; } return m_status; } } /// /// 等待指定时间 /// /// /// public Task WaitAsync(TimeSpan timeSpan) { return this.WaitAsync((int)timeSpan.TotalMilliseconds); } /// /// 等待指定毫秒 /// /// public async Task WaitAsync(int millisecond) { if (DelayModel) { for (int i = 0; i < millisecond / 10.0; i++) { if (m_status != WaitDataStatus.Default) { return m_status; } await Task.Delay(10); } m_status = WaitDataStatus.Overtime; return m_status; } else { if (!m_waitHandle.WaitOne(millisecond)) { m_status = WaitDataStatus.Overtime; } return m_status; } } /// /// 释放 /// /// protected override void Dispose(bool disposing) { m_status = WaitDataStatus.Disposed; m_waitResult = default; m_waitHandle.SafeDispose(); base.Dispose(disposing); } } }