Проблема с тайм-аутом верхней полки

Мы используем Topshelf для размещения службы. Перед запуском службы мы вызываем базу данных для загрузки большого количества данных. Из-за этого при запуске службы мы получаем следующую ошибку:

Start Service failed with return code '[7] ServiceRequestTimeout

Мы используем следующий код для запуска службы:

HostFactory.Run(x =>
            {
                x.Service<AppService>(s =>
                {
                    s.ConstructUsing(name => new AppService(s_resolver, baseAddress, resolver));
                    s.WhenStarted(svc => svc.Start());
                    s.WhenStopped(svc => svc.Stop());
                    s.WhenShutdown(svc => svc.Shutdown());
                });

                x.EnableShutdown();
                x.RunAsLocalService();
                x.StartAutomatically();
                x.SetDisplayName("Application Host");
                x.SetDescription("Application Host");
            });

Если я попытаюсь запустить службу с помощью Visual Studio, служба будет работать нормально. Но когда сервис размещается через Topshelf, я получаю ошибку тайм-аута.

Я также пробовал использовать hostControl.RequestAdditionalTime(TimeSpan.FromSeconds(300)), но даже после добавления дополнительного периода ожидания я не могу решить проблему. Пожалуйста, поделитесь своими предложениями.


person SharpCoder    schedule 25.10.2013    source источник
comment
topshelf-4 дает вам x.SetStartTimeOut (Timespan) и x.SetStopTimeout (TimeSpan)   -  person BozoJoe    schedule 09.11.2016


Ответы (2)


Какая документация для HostControl.RequestAdditionalTime < / a> не указывает, что вы можете запросить максимум 60 или 120 секунд. В противном случае он проигнорирует ваш запрос.

Это блестяще задокументировано абсолютно нигде, о чем я знаю :( Если вы найдете это где-то задокументированным, пожалуйста, дайте мне знать.

person Travis    schedule 25.10.2013
comment
Спасибо за ответ Трэвис. Я попытался установить 120 как AdditionalTime, но даже это не работает. - person SharpCoder; 28.10.2013
comment
Неа. Я проверю и дам знать :) Но я точно попробовал 120, и это не сработало - person SharpCoder; 29.10.2013
comment
Не могли бы вы использовать задачу для получения базы данных, а затем продолжить с фактическим поведением при запуске? Task.Run занимает практически нулевое время ... - person Chris Pfohl; 20.11.2013
comment
@Hooman Это было ограничение базового Windows Service Manager (Windows, а не .NET API), я не понимаю, остается ли это ограничение для более новых серверных / настольных версий, поскольку это было с 2013 года, и я не следил за что. - person Travis; 06.01.2019

Вот драконы

от TopShelf

void HostControl.RequestAdditionalTime(TimeSpan timeRemaining)
    {
        _log.DebugFormat("Requesting additional time: {0}", timeRemaining);

        RequestAdditionalTime((int)timeRemaining.TotalMilliseconds);
    }

А вот и JustDecompile из ServiceBase

    /// <summary>Requests additional time for a pending operation.</summary>
    /// <param name="milliseconds">The requested time in milliseconds.</param>
    /// <exception cref="T:System.InvalidOperationException">The service is not in a pending state.</exception>
    [ComVisible(false)]
    public void RequestAdditionalTime(int milliseconds)
    {
        unsafe
        {
            fixed (NativeMethods.SERVICE_STATUS* sERVICESTATUSPointer = &this.status)
            {
                if (this.status.currentState != 5 && this.status.currentState != 2 && this.status.currentState != 3 && this.status.currentState != 6)
                {
                    throw new InvalidOperationException(Res.GetString("NotInPendingState"));
                }
                this.status.waitHint = milliseconds;
                this.status.checkPoint = this.status.checkPoint + 1;
                NativeMethods.SetServiceStatus(this.statusHandle, sERVICESTATUSPointer);
            }
        }
    }
person BozoJoe    schedule 08.11.2016
comment
Я не могу проголосовать, так как ничего не знаю об API, но LOL @ Here be Dragons. - person Bryan Watts; 08.07.2017