// private async Task SearchTaskBody(CancellationToken token) { using (var cts = CancellationTokenSource.CreateLinkedTokenSource(token, this.onDisposeCancelSource.Token)) { // var cancellationToken = cts.Token; while (!cancellationToken.IsCancellationRequested) { try { lock (this.sync) { // резервируем бд if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease()) { // lease найдена и действует var leaseLostToken = this.dbServices.LockObject.GetLoseLeaseToken(); // ждём потери или завершения WaitHandle.WaitAny(new WaitHandle[] { leaseLostToken.WaitHandle, cancellationToken.WaitHandle }); continue; } else { // lease НЕ найдена или НЕ действует this.dbServices?.Dispose(); this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken); } } cancellationToken.ThrowIfCancellationRequested(); // lease не зарезервировалась await Task.Delay(this.settings.SearchDbTimeout, cancellationToken); } catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested) { // завершаем return; } catch (Exception) { // ignore ?? } } } }
public async Task <ReserveResult> RenewLeaseAsync(CancellationToken token) { if (this.isDisposed) { throw new ObjectDisposedException("dbServices"); } lock (this.sync) { if (this.isDisposed) { throw new ObjectDisposedException("dbServices"); } using (var cts = CancellationTokenSource.CreateLinkedTokenSource(token, this.onDisposeCancelSource.Token)) { // cts.CancelAfter(settings.LostDbTimeout); var cancellationToken = cts.Token; while (!cancellationToken.IsCancellationRequested) { try { // резервируем бд if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease()) { return(ReserveResult.FromValueResult(true, new[] { this.dbServices })); } else { // lease НЕ найдена или НЕ действует this.dbServices?.Dispose(); this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken); } // резервируем бд if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease()) { // lease найдена и действует } else { // lease НЕ найдена или НЕ действует // lease потеряна, попробуем восстановить if (this.dbServices?.LockObject.CheckAndUpdateOrAcquireLease(cancellationToken) == true) { } else { // lease не востановлена или была не найдена, попробуем зарезервировать this.dbServices?.Dispose(); this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken); } } //// резервируем бд //if (this.dbServices != null) //{ // if (this.dbServices.LockObject.CheckIfHasLease()) // { // // lease ещё действует // return ReserveResult.SuccessResult(this.dbServices); // } // else // { // // lease потеряна, попробуем восстановить // if (!this.dbServices.LockObject.CheckAndUpdateOrAcquireLease(cancellationToken)) // { // // lease потеряна, ищем новую // this.dbServices?.Dispose(); // this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(this.dbClusterParameters, cancellationToken); // } // else // { // // lease действует // } // } //} //else //{ // // lease ещё не резервировалась // this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(this.dbClusterParameters, cancellationToken); //} // lease не зарезервировалась if (this.dbServices == null) { var searchDelay = this.settings.SearchDbTimeout; // Task.Delay(searchDelay, cancellationToken).Wait(cancellationToken); if (cancellationToken.IsCancellationRequested) { return(ReserveResult.FailResult()); } continue; } else { return(ReserveResult.FromValueResult(this.dbServices.LockObject.CheckAndUpdateLease(), new[] { this.dbServices })); } } catch (OperationCanceledException) { return(ReserveResult.FailResult()); } catch (Exception) { // ignore ?? } } return(ReserveResult.FailResult()); } } }