Пример #1
0
        private bool WaitForServiceStatus(ServiceController serviceController, ServiceControllerStatus status, Unlimited <EnhancedTimeSpan> maximumWaitTime, bool ignoreFailures, bool sendWatsonReportForHungService)
        {
            ExDateTime now         = ExDateTime.Now;
            string     serviceName = serviceController.ServiceName;
            SafeHandle safeHandle  = null;

            try
            {
                safeHandle = serviceController.ServiceHandle;
            }
            catch (Exception e)
            {
                base.WriteVerbose(Strings.ExceptionCannotGetServiceHandle(serviceName, e));
            }
            ExDateTime     exDateTime     = now;
            SERVICE_STATUS service_STATUS = default(SERVICE_STATUS);

            service_STATUS.dwCheckPoint = 0U;
            service_STATUS.dwWaitHint   = 25000U;
            bool result;

            try
            {
                for (;;)
                {
                    ExDateTime     exDateTime2     = exDateTime;
                    SERVICE_STATUS service_STATUS2 = service_STATUS;
                    exDateTime = ExDateTime.Now;
                    if (safeHandle != null)
                    {
                        if (NativeMethods.QueryServiceStatus(safeHandle, ref service_STATUS) == 0)
                        {
                            base.WriteError(new Win32Exception(Marshal.GetLastWin32Error()), ErrorCategory.InvalidOperation, null);
                        }
                        if ((ulong)service_STATUS.dwCurrentState == (ulong)((long)status))
                        {
                            break;
                        }
                        if (service_STATUS.dwCheckPoint == service_STATUS2.dwCheckPoint)
                        {
                            this.WriteWarning(Strings.CheckPointNotProgressed(service_STATUS2.dwCheckPoint, service_STATUS.dwCheckPoint));
                            base.WriteVerbose(Strings.PreviousQueryTime(exDateTime2.ToString()));
                            base.WriteVerbose(Strings.CurrentQueryTime(exDateTime.ToString()));
                            if (exDateTime2.AddMilliseconds(service_STATUS2.dwWaitHint + 600000U) < exDateTime)
                            {
                                goto Block_9;
                            }
                        }
                        else
                        {
                            base.WriteVerbose(Strings.CheckPointProgressed(service_STATUS2.dwCheckPoint, service_STATUS.dwCheckPoint));
                        }
                    }
                    uint num = (service_STATUS.dwWaitHint == 0U) ? 25000U : service_STATUS.dwWaitHint;
                    try
                    {
                        base.WriteVerbose(Strings.WaitForServiceStatusChange(num, serviceName, status.ToString()));
                        serviceController.WaitForStatus(status, TimeSpan.FromMilliseconds(num));
                        base.WriteVerbose(Strings.ServiceReachedStatusDuringWait(serviceName, status.ToString()));
                        return(true);
                    }
                    catch (System.ServiceProcess.TimeoutException)
                    {
                        base.WriteVerbose(Strings.ServiceDidNotReachStatusDuringWait(serviceName, status.ToString(), num));
                        if (!maximumWaitTime.IsUnlimited && now.AddMilliseconds(maximumWaitTime.Value.TotalMilliseconds) < ExDateTime.Now)
                        {
                            if (!ignoreFailures)
                            {
                                if (sendWatsonReportForHungService)
                                {
                                    this.SendWatsonReportForHungService(serviceName);
                                }
                                base.WriteError(new ServiceDidNotReachStatusException(serviceName, status.ToString()), ErrorCategory.InvalidOperation, null);
                            }
                            else
                            {
                                this.WriteWarning(Strings.ServiceDidNotReachStatus(serviceName, status.ToString()));
                            }
                            return(false);
                        }
                    }
                }
                base.WriteVerbose(Strings.ServiceReachedStatus(serviceName, status.ToString()));
                return(true);

Block_9:
                if (!ignoreFailures)
                {
                    if (sendWatsonReportForHungService)
                    {
                        this.SendWatsonReportForHungService(serviceName);
                    }
                    base.WriteError(new ServiceDidNotReachStatusException(serviceName, status.ToString()), ErrorCategory.InvalidOperation, null);
                }
                else
                {
                    this.WriteWarning(Strings.ServiceDidNotReachStatus(serviceName, status.ToString()));
                }
                result = false;
            }
            finally
            {
                if (safeHandle != null)
                {
                    safeHandle.Close();
                }
            }
            return(result);
        }