示例#1
0
        protected override void ShutdownCore()
        {
            AsyncTaskSequenceSerial sequence = new AsyncTaskSequenceSerial(this);

            sequence.Name = "ShutdownAppPlatform";
            sequence.AddTask(new AsyncTask(this.ShutdownReverseLookup, null));
            //sequence.AddTask(new AsyncTask(this.ShutdownWorkflowRuntime, null));
            // Shutdown all front ends in parallel.
            AsyncTaskSequenceParallel shutdownAppFrontEndsSequence = new AsyncTaskSequenceParallel(this);
            AsyncTask shutdownAppFrontEndsAction = new AsyncTask(AsyncTask.SequenceStartingMethod, shutdownAppFrontEndsSequence);

            sequence.AddTask(shutdownAppFrontEndsAction);
            shutdownAppFrontEndsSequence.Name = "ShutdownAppFrontEnds";
            shutdownAppFrontEndsSequence.FailureCompletionReportHandlerDelegate = shutdownAppFrontEndsAction.Complete;
            shutdownAppFrontEndsSequence.SuccessCompletionReportHandlerDelegate = shutdownAppFrontEndsAction.Complete;
            // Populate the parallel sequence with individual customer sessions to terminate.
            lock (this.SyncRoot)
            {
                foreach (AppFrontEnd fe in m_frontEnds)
                {
                    AsyncTask task = new AsyncTask(this.ShutdownFrontEnd, fe);
                    shutdownAppFrontEndsSequence.AddTask(task);
                }
            }

            sequence.AddTask(new AsyncTask(this.ShutdownCollaborationPlatform));
            sequence.SuccessCompletionReportHandlerDelegate = this.CompleteShutdown;
            sequence.FailureCompletionReportHandlerDelegate = this.CompleteShutdown;
            sequence.Start();
        }
示例#2
0
        protected override void ShutdownCore()
        {
            m_endpoint.UnregisterForIncomingCall <AudioVideoCall>(this.ReceiveIncomingAvCall);
            m_endpoint.UnregisterForIncomingCall <InstantMessagingCall>(this.ReceiveIncomingIMCall);
            AsyncTaskSequenceSerial sequence = new AsyncTaskSequenceSerial(this);

            sequence.Name = "ShutdownAppFrontEnd";
            sequence.SuccessCompletionReportHandlerDelegate = this.CompleteShutdown;
            sequence.FailureCompletionReportHandlerDelegate = this.CompleteShutdown;
            sequence.AddTask(new AsyncTask(this.ShutdownCallbackManager));
            sequence.AddTask(new AsyncTask(this.ShutdownMusicProvider));

            // Shutdown customer sessions in parallel.
            AsyncTaskSequenceParallel customerSessionsSequence = new AsyncTaskSequenceParallel(this);
            AsyncTask shutdownCustomerSessions = new AsyncTask(AsyncTask.SequenceStartingMethod, customerSessionsSequence);

            customerSessionsSequence.Name = "ShutdownCustomerSessions";
            customerSessionsSequence.FailureCompletionReportHandlerDelegate = shutdownCustomerSessions.Complete;
            customerSessionsSequence.SuccessCompletionReportHandlerDelegate = shutdownCustomerSessions.Complete;
            // Populate the parallel sequence with individual customer sessions to terminate.
            lock (this.SyncRoot)
            {
                foreach (CustomerSession session in m_customerSessions)
                {
                    AsyncTask task = new AsyncTask(this.ShutdownCustomerSession, session);
                    customerSessionsSequence.AddTask(task);
                }
            }
            sequence.AddTask(shutdownCustomerSessions);

            // Shutdown user endpoint just in case they are still there.
            AsyncTaskSequenceParallel userEndpointsShutdownSequence = new AsyncTaskSequenceParallel(this);
            AsyncTask shutdownUserEndpoints = new AsyncTask(AsyncTask.SequenceStartingMethod, userEndpointsShutdownSequence);

            userEndpointsShutdownSequence.Name = "ShutdownUserEndpoints";
            userEndpointsShutdownSequence.FailureCompletionReportHandlerDelegate = shutdownUserEndpoints.Complete;
            userEndpointsShutdownSequence.SuccessCompletionReportHandlerDelegate = shutdownUserEndpoints.Complete;
            lock (this.SyncRoot)
            {
                foreach (MyUserEndpoint myUserEndpoint in m_userEndpoints.Values)
                {
                    AsyncTask task = new AsyncTask(this.ShutdownUserEndpoint, myUserEndpoint.UserEndpoint);
                    userEndpointsShutdownSequence.AddTask(task);
                }
            }
            sequence.AddTask(shutdownUserEndpoints);
            sequence.AddTask(new AsyncTask(this.ShutdownEndpoint));
            sequence.Start();
        }
示例#3
0
        /// <summary>
        /// Shuts down the callback manager. Clean up all pending requests.
        /// </summary>
        protected override void ShutdownCore()
        {
            AsyncTaskSequenceParallel requestsToCleanup = new AsyncTaskSequenceParallel(this);

            requestsToCleanup.Name = "ShutdownCallbackManager";
            requestsToCleanup.SuccessCompletionReportHandlerDelegate = this.CompleteShutdown;
            requestsToCleanup.FailureCompletionReportHandlerDelegate = this.CompleteShutdown;
            m_cleanupTimer.Stop();
            List <CallbackRequest> requestsSnapshot = null;

            lock (this.SyncRoot)
            {
                requestsSnapshot = m_pendingRequests.ToList();
                m_pendingRequests.Clear();
            }

            foreach (CallbackRequest request in requestsSnapshot)
            {
                AsyncTask cleanupAction = new AsyncTask(this.CleanupRequest, request);
                cleanupAction.IsOptional = true; // We don't want one clean up to abort others.
                requestsToCleanup.AddTask(cleanupAction);
            }
            requestsToCleanup.Start();
        }
示例#4
0
        private void CleanupElapsed(object sender, ElapsedEventArgs e)
        {
            if (this.IsTerminatingTerminated)
            {
                return;
            }
            AsyncTaskSequenceParallel requestsToCleanup = new AsyncTaskSequenceParallel(this);

            requestsToCleanup.Name = "CleanupStaleRequests";
            lock (this.SyncRoot)
            {
                var cutoff = DateTime.Now.Subtract(m_maxLifeSpanOfRequest);

                while (m_pendingRequests.First != null && m_pendingRequests.First.Value.CreationTime < cutoff)
                {
                    CallbackRequest request = m_pendingRequests.First.Value;
                    m_pendingRequests.RemoveFirst();
                    AsyncTask cleanupAction = new AsyncTask(this.CleanupRequest, request);
                    cleanupAction.IsOptional = true;
                    requestsToCleanup.AddTask(cleanupAction);
                }
            }
            requestsToCleanup.Start();
        }