示例#1
0
 protected override void Dispose(bool explicitDispose)
 {
     if (explicitDispose)
     {
         _runControl?.Dispose();
         _postingCts?.Dispose();
         var postingQueueSpinLock = _postingQueueSpinLock;
         if (postingQueueSpinLock != null)
         {
             postingQueueSpinLock.Invoke(() => _postingQueue.Fluent().NullCond(x => x.ToList()))
             .Fluent().NullCond(postingQueueCopy => postingQueueCopy.DisposeMany());
             postingQueueSpinLock.Invoke(() => _postingQueue.Fluent().NullCond(x => x.Clear()));
         }
         var subscriptionsSpinLock = _subscriptionsSpinLock;
         if (subscriptionsSpinLock != null)
         {
             subscriptionsSpinLock.Invoke(() => _subscriptionsList.Fluent().NullCond(x => x.ToList()))
             .Fluent().NullCond(subscriptionsListCopy => subscriptionsListCopy.Where(i => (i.State & LocalSubscriptionStates.PublisherOwnsSubscription) == LocalSubscriptionStates.PublisherOwnsSubscription).DisposeMany());
             subscriptionsSpinLock.Invoke(() => _subscriptionsList.Fluent().NullCond(x => x.Clear()));
             subscriptionsSpinLock.Invoke(() => _subscriptionsDictionary.Fluent().NullCond(x => x.Clear()));
         }
         _postingWorkers.DisposeAndClearArray();
     }
     _postingQueue            = null;
     _postingQueueSpinLock    = null;
     _postingWorkers          = null;
     _runningSettings         = null;
     _subscriptionsDictionary = null;
     _subscriptionsList       = null;
     _subscriptionsSpinLock   = null;
     _runControl = null;
     _postingCts = null;
     //
     base.Dispose(explicitDispose);
 }
 protected override void Dispose(bool explicitDispose)
 {
     if (explicitDispose)
     {
         _activateControl?.Dispose();
     }
     _component       = null;
     _activateControl = null;
     //
     base.Dispose(explicitDispose);
 }
示例#3
0
        // TODO: Put strings into the resources.
        //
        protected override async Task OnInitializeAsync(IContext ctx = default)
        {
            RunControl <ResetServant <TDescription> > activateControl = default;
            ITriggerXInstance resetTrigger = default;

            try {
                var componentDescription = Description.Component;
                var componentDisability  = componentDescription.IsDisabled();
                if (componentDisability)
                {
                    this.LogDisabilityWarning(description: componentDescription);
                    WriteDA(
                        location: ref _activateControlFactory,
                        value:
                        (locOptions, locComponent, locAttemptState, locBeforeActivate, locActivate, locDeactivate, locDeactivateToken)
                        =>
                        new RunControl <ResetServant <TDescription> >(
                            options: locOptions,
                            component: locComponent,
                            attemptState: locAttemptState,
                            beforeStart: locBeforeActivate,
                            start: locState => P_DoActivateAsync(state: locState, continuation: locActivate, componentDisability: true),
                            stop: () => P_DoDeactivateAsync(continuation: locDeactivate, componentDisability: true),
                            stopToken: locDeactivateToken));
                    resetTrigger = null;
                }
                else
                {
                    switch (Description.ResetFailureResponseCode)
                    {
                    case ResetServantResetFailureResponseCode.None:
                        WriteDA(location: ref _resetFailureResponseDelegate, value: null);
                        break;

                    default:
                        RequireComponentResetFailureResponseDelegate(dlg: out var failureResponseDlg);
                        if (failureResponseDlg is null)
                        {
                            throw new EonException(message: $"Method '{nameof(RequireComponentResetFailureResponseDelegate)}' has returned invalid result '{failureResponseDlg.FmtStr().G()}'.{Environment.NewLine}\tComponent:{this.FmtStr().GNLI2()}");
                        }
                        WriteDA(ref _resetFailureResponseDelegate, failureResponseDlg);
                        break;
                    }
                    //
                    WriteDA(
                        location: ref _activateControlFactory,
                        value:
                        (locOptions, locComponent, locAttemptState, locBeforeActivate, locActivate, locDeactivate, locDeactivateToken)
                        =>
                        new RunControl <ResetServant <TDescription> >(
                            options: locOptions,
                            component: locComponent,
                            attemptState: locAttemptState,
                            beforeStart: locBeforeActivate,
                            start: locState => P_DoActivateAsync(state: locState, continuation: locActivate, componentDisability: false),
                            stop: () => P_DoDeactivateAsync(continuation: locDeactivate, componentDisability: false),
                            stopToken: locDeactivateToken));
                    if (!Description.ResetTrigger.IsDisabled)
                    {
                        resetTrigger = await this.CreateInitializeAppScopeInstanceAsync <ITriggerXInstance>(description : Description.ResetTrigger, ctx : ctx).ConfigureAwait(false);
                    }
                    else
                    {
                        resetTrigger = null;
                    }
                }
                WriteDA(ref _resetTrigger, resetTrigger);
                //
                await base.OnInitializeAsync(ctx : ctx).ConfigureAwait(false);
            }
            catch (Exception exception) {
                resetTrigger?.Dispose(exception);
                activateControl?.Dispose(exception);
                throw;
            }
        }