2

처음으로 오랜 시간의 독자를 게시합니다.파일 탐색기를 사용하는 Windows 서비스 #

Windows 서비스로 이동하기 전에 100 % 제대로 작동하는 Windows 양식 응용 프로그램 내에 작업 파일 워처를 작성했으며 이제는 두 가지 별도의 문제가 발생합니다. 이 파일 감시자는 라인 업데이트 (최종 수정)를위한 플랫 파일을 읽고, 파일 (스트림 작성기)을 삭제/다시 만들고, 마지막으로 강력한 형식의 데이터 세트를 파싱 한 다음 SQL 서버에 업로드합니다. (내 첫 Windows 서비스) 질문 :
1. filewatcher의 double 이벤트 트리거가 양식 응용 프로그램과 다르게 서비스를 수행합니까?
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 인증입니까? 당신은 무엇을 인증하려고합니까? –

답변

0

:

당신은 Windows 서비스로 실행 Main()ServiceBase.Run 방법을 사용해야하지만, 당신은 정상과 같은 응용 프로그램을 실행하는 주요 방법으로 전환 할 수 있습니다 콘솔 응용 프로그램 (예 : --standalone). 나는 모든 서비스에서 디버깅하기 쉽도록 이것을 사용하고 있습니다. 다른 문제에 대해서는

:

나는 완전히 당신이 발생하는 문제가 확실하지 않다 당신은 "급 브레이크 '와'더블 이벤트 트리거"무슨 뜻.

Windows 서비스는 관심있는 디렉터리를 볼 수있는 권한이 있거나없는 특수 서비스 계정으로 실행됩니다. 필요한 경우 서비스 계정을 변경하거나 디렉터리에 대한 권한을 부여 할 수 있습니다.

링크 :

여기에 파일 감시자 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 서비스로 실행됩니다. 그렇지 않으면 콘솔을 할당하고 서비스를 실행 한 다음 서비스를 종료하기 전에 키를 누를 때까지 기다립니다. 테스트를 일시 중지하고 계속 진행할 수 있습니다.