static Task P_BeforeDisposeAsync(P_Lifecycle lifecycle, Action continuation) { try { if (lifecycle is null) { throw new ArgumentNullException(paramName: nameof(lifecycle)); } // if (lifecycle.Disposing || lifecycle.IsDisposed) { return(TaskUtilities.FromVoidResult()); } else { return(doDisposeAsync()); } } catch (Exception exception) { return(TaskUtilities.FromError(error: exception)); } // async Task doDisposeAsync() { lifecycle.SetDisposeRequested(); var acquisition = lifecycle._acquisition; if (!(acquisition is null)) { await acquisition.ReleaseAsync().ConfigureAwait(false); } continuation?.Invoke(); } }
static Task P_DefaultRelease(IVh <T> instance) { try { instance?.Dispose(); return(TaskUtilities.FromVoidResult()); } catch (Exception exception) { return(TaskUtilities.FromError(exception)); } }
static Func <IVh <T>, Task> P_GetReleaseDelegate(Action <IVh <T> > release) { release.EnsureNotNull(nameof(release)); // return ((locInstance) => { try { release(locInstance); return TaskUtilities.FromVoidResult(); } catch (Exception exception) { return TaskUtilities.FromError(error: exception); } }); }
// TODO: Put strings into the resources. // protected override Task DoActivateAsync(IRunControlAttemptState state) { try { state.EnsureNotNull(nameof(state)); // CancellationTokenSource cts = default; try { cts = CancellationTokenSource.CreateLinkedTokenSource(tokens: new CancellationToken[] { App.AppShutdownToken }); var ct = cts.Token; if (UpdDAIfNullBool(ref _currentActivationCts, cts)) { P_ScheduleNextSignal(period: P_SelectNextPeriod(), ct: ct); } else { throw new EonException( message: $"Недопустимый вызов операции. Операция уже была выполнена ранее. Для повторного выполнения необходимо сначала выполнить операцию '{nameof(DoDeactivateAsync)}'.{Environment.NewLine}\tКомпонент:{this.FmtStr().GNLI2()}"); } } catch (Exception exception) { if (!(cts is null)) { ExceptionUtilities .TryCatch( op: () => { cts.Cancel(throwOnFirstException: false); itrlck.SetNullBool(location: ref _currentActivationCts, comparand: cts); cts.Dispose(); }, exception: exception); } throw; } return(TaskUtilities.FromVoidResult()); } catch (Exception exception) { return(TaskUtilities.FromError(error: exception)); } }
public static Task DisposeAsync(P_Lifecycle lifecycle) { try { if (lifecycle is null) { throw new ArgumentNullException(paramName: nameof(lifecycle)); } // if (lifecycle.Disposing || lifecycle.IsDisposed) { return(TaskUtilities.FromVoidResult()); } else { return(P_BeforeDisposeAsync(lifecycle: lifecycle, continuation: lifecycle.Dispose)); } } catch (Exception exception) { return(TaskUtilities.FromError(error: exception)); } }
Task P_DoStopAsync() { try { var cancellationTokenSource = ReadDA(ref _cancellationTokenSource); if (!cancellationTokenSource.IsCancellationRequested) { cancellationTokenSource.Cancel(); } var loopTask = ReadDA(ref _loopTask); if (loopTask == null) { return(TaskUtilities.FromVoidResult()); } else { return(loopTask); } } catch (Exception firstException) { return(TaskUtilities.FromError(error: firstException)); } }
// TODO: Put strings into the resources. // Task P_DoStartAsync(IRunControlAttemptState state) { // TODO_HIGH: Этот таймаут должен браться из контекста запуска (когда будет реализован) как время оставшееся для выполнения операции запуска. // const int loopStartMillisecondsTimeout = 10000; try { state.EnsureNotNull(nameof(state)); // var ct = ReadDA(ref _cancellationTokenSource).Token; ManualResetEventSlim loopStartedEvent = default; try { loopStartedEvent = new ManualResetEventSlim(initialState: false); Task loopTask; Interlocked .Exchange( location1: ref _loopTask, value: loopTask = TaskUtilities .RunOnDefaultScheduler( action: P_Loop, state: new P_LoopStartState(worker: this, loopStartedEvent: loopStartedEvent), cancellationToken: ct, options: TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning)); if (!loopStartedEvent.Wait(millisecondsTimeout: loopStartMillisecondsTimeout)) { loopStartedEvent.Dispose(); // if (loopTask.IsCompleted) { throw new EonException( message: "Цикл обработки очереди рабочих элементов не запустился в отведённое для запуска время. Время ожидания запуска истекло." + (loopTask.IsCanceled ? $"{Environment.NewLine}Задача цикла была отменена." : string.Empty), innerException: loopTask.IsFaulted ? loopTask.Exception : null); } else { throw new TimeoutException( message: $"Цикл обработки очереди рабочих элементов не запустился в отведённое для запуска время. Время ожидания запуска истекло.{Environment.NewLine}Статус задачи цикла:{loopTask.Status.FmtStr().GNLI()}"); } } // loopTask .ContinueWith( continuationAction: P_OnLoopTaskCompleted, cancellationToken: CancellationToken.None, continuationOptions: TaskContinuationOptions.PreferFairness, scheduler: TaskScheduler.Default); } finally { loopStartedEvent?.Dispose(); } // return(TaskUtilities.FromVoidResult()); } catch (Exception firstException) { return(TaskUtilities.FromError(error: firstException)); } }
protected override Task DoDeactivateAsync() => TaskUtilities.FromVoidResult();