2009-09-22 83 views
1

我正在使用VSTS 2008 + C#+ .Net 3.5開發Windows服務應用程序。下面的代碼非常簡單,我發現File.Copy拋出異常(例如路徑無效,沒有權限等)時,服務會崩潰並彈出一個對話框讓我調試。我的困惑是,我認爲由Windows服務創建的線程的未處理異常不會導致服務崩潰。爲什麼我的服務崩潰並且調試對話框彈出?爲什麼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() 
     { 
     } 
    } 
+1

錯誤...因爲它有一個錯誤? – wefwfwefwe 2009-09-22 09:42:55

+0

虛擬gzillions的點。激勵的答案在哪裏?我認爲這是另一回事。 – Khash 2010-06-10 14:53:58

回答

6

我想通過一個Windows服務創建一個線程未處理的異常不會讓服務崩潰

你的假設是完全錯誤的。 Windows服務中的未處理異常將導致其崩潰。出現調試對話框是因爲您的系統上配置了調試器。從.NET 2.0開始,任何線程上的未處理的異常都會關閉整個應用程序。僅僅因爲你使用線程並不意味着線程中的異常會神奇地消失。

+0

從Windows服務的任何線程拋出的異常將使Windows服務崩潰? – George2 2009-09-22 09:55:36

+2

是的。這不是服務所特有的,對任何應用程序來說都是一樣的。 – blowdart 2009-09-22 10:01:27

+0

謝謝,問題回答! – George2 2009-09-22 10:08:38

2

您的文件複製操作正在拋出一個未被捕獲的異常。就那麼簡單。除非在try catch塊中包裝File.Copy操作,否則該服務將失敗。操作在後臺線程上執行並不重要。我還建議增加一些日誌,否則你不會發現它失敗的原因。

+1

我不確定這是否一樣,但是我們之前已經從一個服務中創建了一個線程主線程(運行時不會阻塞服務)。然後它將檢索用戶列表,並循環用戶,爲每個用戶創建一個線程來執行任務。在線程有未處理的異常的事件中,其他線程disd完成。我在做什麼,或者這與問題的內容有何不同? – 2009-09-22 09:39:51

+0

從Windows服務的任何線程拋出的異常將使Windows服務崩潰? – George2 2009-09-22 09:56:08

0

您啓動了一個用於在WriteF中運行代碼的新線程。如果此代碼在發生異常時失敗,則運行時將嘗試通過展開該特定線程的堆棧來查找異常處理程序。如果它在查找處理程序時失敗,那麼運行時沒有選項,只能報告一個未處理的異常,從而終止該進程。記住異常處理是每個線程。這不是Windows服務問題。