У меня есть служба 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());
}
}