почему происходит сбой службы Windows? - PullRequest
1 голос
/ 22 сентября 2009

Я использую VSTS 2008 + C # + .Net 3.5 для разработки приложения службы Windows. Ниже приведен очень простой код, и я обнаружил, что когда File.Copy выдает исключение (например, неверный путь, отсутствие разрешения и т. Д.), Служба аварийно завершает работу и открывает диалоговое окно, позволяющее отладить меня. Я путаюсь, я думаю, что необработанное исключение потока, созданного службой Windows, никогда не вызовет сбой службы. Почему происходит сбой моего сервиса и всплывающее диалоговое окно отладки?

   public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread t = new Thread (WriteF);
            t.Start();
        }

          static void WriteF() {
              File.Copy("dummy.txt", @"\\somelocation\dummy.txt");
          }

        protected override void OnStop()
        {
        }
    }

Ответы [ 3 ]

6 голосов
/ 22 сентября 2009

Я думаю, что необработанное исключение потока, созданного службой Windows, никогда не вызовет сбой службы

Ваше предположение просто неверно. Необработанные исключения в службе Windows приведут к сбою. Диалог отладки появляется потому, что в вашей системе настроен отладчик. Начиная с .NET 2.0, необработанное исключение в любом потоке завершает работу всего приложения. То, что вы используете поток, не означает, что исключения в нем волшебным образом исчезнут.

2 голосов
/ 22 сентября 2009

Ваша операция копирования файла вызывает исключение, которое не перехватывается. Просто как тот. Служба не будет работать, если вы не поместите операцию File.Copy в блок try catch. Не имеет значения, что операция выполняется в фоновом потоке. Я бы также предложил добавить несколько журналов, иначе вы не поймете, почему они не работают.

0 голосов
/ 22 сентября 2009

Вы запускаете новый поток для запуска кода в WriteF. Если этот код завершится с ошибкой, среда выполнения попытается найти обработчик исключения, размотав стек для этого конкретного потока. Если не удается найти обработчик, среда выполнения не имеет другого выбора, кроме сообщения о необработанном исключении, и, следовательно, процесс завершается. Помните, что обработка исключений для каждого потока. Это не проблема службы Windows.

...