using System; using System.Threading; using System.Threading.Tasks; namespace Aging.Infrastructure.Contracts { /// /// 资源冲突异常。 /// 当尝试预约已被其他所有者占用的资源时抛出。 /// public sealed class ResourceConflictException : Exception { /// /// 初始化资源冲突异常实例 /// /// 冲突描述信息 public ResourceConflictException(string message) : base(message) { } /// /// 初始化资源冲突异常实例 /// /// 冲突描述信息 /// 内部异常 public ResourceConflictException(string message, Exception innerException) : base(message, innerException) { } } /// /// 资源管理接口。 /// 提供硬件资源的预约、租约获取和释放功能,确保资源不被多个会话同时占用。 /// public interface IResourceManager { /// /// 异步预约资源。 /// 创建长期预约,阻止其他所有者使用该资源。 /// /// 所有者令牌 /// 资源键 /// 取消令牌 /// 资源预约实体 /// 资源已被其他所有者预约时抛出 Task ReserveAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct); /// /// 异步获取操作租约。 /// 在执行具体硬件操作前调用,确保操作期间资源不被抢占。 /// /// 所有者令牌 /// 资源键 /// 取消令牌 /// 操作租约 /// 资源未预约或所有者不匹配时抛出 Task AcquireOperationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct); /// /// 异步释放资源预约。 /// 取消对资源的占用,允许其他所有者预约。 /// /// 所有者令牌 /// 资源键 /// 取消令牌 Task ReleaseReservationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct); /// /// 检查资源是否已被预约 /// /// 资源键 /// 输出预约实体(如果已预约) /// 资源是否已被预约 bool IsReserved(ResourceKey resource, out ResourceReservation? reservation); /// /// 验证所有者令牌是否匹配指定资源的预约 /// /// 所有者令牌 /// 资源键 /// 所有者是否匹配 bool ValidateOwner(ResourceOwnerToken owner, ResourceKey resource); } }