Служба Windows блокируется при загрузке сборки - PullRequest
2 голосов
/ 20 июля 2010

У меня есть служба Windows, написанная на C #. Он также включает автономный режим консоли для отладки. Он отлично работает практически на каждом компьютере, на котором он запущен, но мы столкнулись с ситуацией, когда эта служба блокируется при попытке запустить ее, а затем она убивается из-за тайм-аута. Но при запуске в консольном режиме на той же машине он запускается нормально.

Трудно отлаживать, потому что на самом деле у меня нет доступа к машине, на которой это происходит, мне нужно пройти через человеческий прокси. Но после множества отладок методом проб и ошибок я, наконец, сузил причину до загрузки сборки. Когда он попадает в первую ссылку на любой тип данных в определенной DLL, он останавливается прямо здесь, в соответствии с файлом журнала. Это даже не исключение, оно просто блокируется.

[Редактировать] После дальнейшего изучения выясняется, что он не блокируется навсегда, для полной загрузки библиотеки требуется около 40 секунд, чего достаточно для того, чтобы службы Windows решили завершить процесс.

Любая подсказка, как отладить такую ​​ситуацию?

Вот самое простое решение, с помощью которого я могу воспроизвести его. «До» отображается, но «Во время» и «После» не отображаются.

private static void LoadAssembly()
{
    Log("During");
    MyNameSpace.MyClass x = new MyNameSpace.MyClass();        
}

static void Main(string[] args)
{
    try
    {
        // Leaving out code to handle command line parameters
        // ...
        //

        Log("Before");
        LoadAssembly();
        Log("After");
        if (Environment.UserInteractive)
        {
            Log("Starting in console mode");
            ConnectionManager.Listen();
        }
        else
        {
            Log("Starting in service mode");
            ServiceBase.Run(new RunAsService());
        }

    }
    catch (Exception ex)
    {
        Log(ex.ToString());
    }
}

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Сборке потребовалось 45 секунд для подключения, она пытается подключиться к Интернету, чтобы проверить что-то о сборке перед загрузкой, но на этой конкретной машине она заблокирована брандмауэром.После 30 секунд попытки запуска диспетчер служб Windows сдается и завершает процесс.

Перемещение загрузки сборки до тех пор, пока служба не будет запущена, не позволит запустить ее должным образом (хотя с задержкой в ​​45 секунд).прежде чем он начнет отвечать).

Похоже, это было связано с генерацией свидетельства издателя.Отсюда http://msdn.microsoft.com/en-us/library/bb629393.aspx:

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

Помещение в файл app.config следующего кода избавило от задержки:

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>
0 голосов
/ 20 июля 2010

Вы что-то делаете при загрузке модуля, удерживая блокировку загрузчика?

См. Эту статью для отладки: http://msdn.microsoft.com/en-us/library/ms172219.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...