2009-09-22 2 views
1

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

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() 
     { 
     } 
    } 
+1

ошибка ... потому что в этом есть ошибка? – wefwfwefwe

+0

Виртуальные gzillions точек. Где стимул отвечать? Я думал, что это что-то еще. – Khash

ответ

6

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

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

+0

Исключение из любых потоков службы Windows приведет к сбою службы Windows? – George2

+2

Да. Это не уникально для сервисов, это то же самое для любого приложения. – blowdart

+0

Спасибо, вопрос ответил! – George2

2

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

+1

Я не уверен, что это то же самое, но у нас было до этого из службы мы создаем поток Main thread (который работает, чтобы не задерживать службу). Затем он будет извлекать список пользователей и зацикливать пользователей, создавая поток для каждого пользователя для выполнения задачи. В случаях, когда поток имел необработанное исключение, остальные потоки не заполняются. Я что-то исхожу, или это отличается от вопроса? –

+0

Исключение из любых потоков службы Windows приведет к сбою службы Windows? – George2

0

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