2

第一次發佈很長一段時間的讀者。c。與filewatcher#窗口服務

我建了一個將它移動到窗口服務之前正確filewatcher Windows窗體應用程序運行100%的容器內工作,我現在recieving兩個單獨的問題。此文件觀察器讀取行更新(lastwrite)的平面文件,刪除/重新創建文件(streamwriter),最後解析強類型數據集,然後上載到SQL服務器。 (這是我的第一個Windows服務) 問題:
1.該雙事件觸發的filewatcher效果服務不同則表單應用程序?
2.有沒有人有答案,爲什麼線程會打破,如果我打電話的課程沒有問題?
3.通過Windows服務進行Windows身份驗證是否存在任何已知問題?
4.有沒有人有強大的Windows服務調試方法?

下面是Windows服務,在此先感謝和我的道歉我的代碼,如果代碼中的一個愚蠢的錯誤,又第一次拍Windows服務。

FileMonitor m_FileMonitor; 
    public WindowsService() 
    { 
     InitializeComponent(); 
    } 
    protected override void OnStart(string[] args) 
    { 
      try 
      { 
       Thread myThread = new Thread(DoTheWork); 
       myThread.Start(); 
      } 
      catch 
      { 

      } 

    } 
    void DoTheWork() 
    { 
     m_FileMonitor = new FileMonitor(Properties.Settings.Default.PathToFileToWatch, Properties.Settings.Default.PathToErrorLog); 
    } 
    protected override void OnStop() 
    { 
     // TODO: Add code here to perform any tear-down necessary to stop your service. 
    } 
+0

#1什麼 「雙重事件觸發」? #2你在問什麼可能的失敗情況是可以觸發你的空捕獲塊? #3什麼樣的Windows身份驗證?你想要認證什麼? – 2012-04-04 23:20:11

回答

0

爲了調試:

您必須使用ServiceBase.Run方法Main()執行作爲Windows服務,但你可以在main方法的交換機,來運行相同的應用程序作爲一個正常的控制檯應用程序(例如--standalone)。我在我的所有服務中都使用它來使它們易於調試。

至於其他問題:

我不能完全肯定你會遇到哪些問題,你的「課間」和「雙事件觸發」的意思。

的Windows服務在一個特殊的服務帳戶運行,這可能會或可能沒有權限看你感興趣的目錄,你可以更改服務帳戶或給它權限的目錄,如果你需要。

鏈接:

這裏是一個CodeProject上的文章誰似乎已經實現了一個文件觀察者窗口服務的鏈接。也許它可以幫助:

http://www.codeproject.com/Articles/18521/How-to-implement-a-simple-filewatcher-Windows-serv

2

要進行調試,請確保您的項目類型是Windows應用程序,然後使用該命令:

[DllImport("kernel32")] 
static extern bool AllocConsole(); 

private static void Main(string[] args) 
{ 
    var service = new MyService(); 
    var controller = ServiceController.GetServices().FirstOrDefault(c => c.ServiceName == service.ServiceName); 
    if (null != controller && controller.Status == ServiceControllerStatus.StartPending) 
    { 
     ServiceBase.Run(service); 
    } 
    else 
    { 
     if (AllocConsole()) 
     { 
      service.OnStart(args); 
      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(); 
      service.OnStop(); 
     } 
     else 
     { 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
     } 
    } 
} 

如果代碼運行時,由於Windows服務啓動,它將作爲Windows服務運行。否則,它將分配一個控制檯,運行服務,然後在退出服務之前等待按鍵。您可以在此基礎上進行測試暫停並繼續。