Ejemplo n.º 1
0
            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();
                }
            }
Ejemplo n.º 2
0
 static Task P_DefaultRelease(IVh <T> instance)
 {
     try {
         instance?.Dispose();
         return(TaskUtilities.FromVoidResult());
     }
     catch (Exception exception) {
         return(TaskUtilities.FromError(exception));
     }
 }
Ejemplo n.º 3
0
 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);
         }
     });
 }
Ejemplo n.º 4
0
 // 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));
     }
 }
Ejemplo n.º 5
0
 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));
     }
 }
Ejemplo n.º 6
0
 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));
     }
 }
Ejemplo n.º 7
0
        // 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));
            }
        }
Ejemplo n.º 8
0
 protected override Task DoDeactivateAsync()
 => TaskUtilities.FromVoidResult();