using RedLockNet; namespace NetAdmin.Host.BackgroundRunning; /// /// 工作基类 /// public abstract class WorkBase { private readonly RedLocker _redLocker; /// /// Initializes a new instance of the class. /// protected WorkBase() { ServiceProvider = App.GetService().CreateScope().ServiceProvider; UowManager = ServiceProvider.GetService(); Logger = ServiceProvider.GetService>(); _redLocker = ServiceProvider.GetService(); } /// /// 日志记录器 /// protected ILogger Logger { get; } /// /// 服务提供器 /// protected IServiceProvider ServiceProvider { get; } /// /// 事务单元管理器 /// protected UnitOfWorkManager UowManager { get; } /// /// 获取锁 /// protected Task GetLockerAsync(string lockId) { return _redLocker.RedLockFactory.CreateLockAsync(lockId, TimeSpan.FromSeconds(Numbers.RED_LOCK_EXPIRY_TIME_SECS) , TimeSpan.FromSeconds(Numbers.RED_LOCK_WAIT_TIME_SECS) , TimeSpan.FromSeconds(Numbers.RED_LOCK_RETRY_TIME_SECS)); } /// /// 通用工作流 /// protected abstract ValueTask WorkflowAsync(CancellationToken cancelToken); /// /// 通用工作流 /// /// 加锁失败异常 protected async ValueTask WorkflowAsync(bool singleInstance, CancellationToken cancelToken) { if (singleInstance) { // 加锁 await using var redLock = await GetLockerAsync(GetType().FullName).ConfigureAwait(false); if (!redLock.IsAcquired) { throw new NetAdminGetLockerException(); } await WorkflowAsync(cancelToken).ConfigureAwait(false); return; } await WorkflowAsync(cancelToken).ConfigureAwait(false); } }