2009-05-04 6 views
0

창 서비스를 만들었습니다. 기본적으로 내 컴퓨터에서 임시 파일을 읽고 데이터베이스로 읽은 다음 삭제합니다. 나는이 작업에 대한 코드를 onStart 방법으로 작성 했으므로 작업이 필요할 때 서비스를 다시 시작해야하지만 실제로 필요한 것은 서비스가 자동으로 내 폴더에서 파일 생성을 감지하고 그 다음에 일하는 중입니다.디렉토리를 폴링하여 새 파일을 찾는 Windows 서비스를 작성하려면 어떻게해야합니까?

내 Windows 서비스에서이 특정 코드를 어디에 배치해야합니까?

답변

5

은 내가 대신 일정 간격으로 Timer를 사용하여 폴링을 추천 할 것입니다 모든 파일 시스템 변경에 알리도록 보장 할 수 없습니다은 FileSystemWatcher. 이 접근 방식은 시스템 리소스에서도 쉽습니다.

내부적으로 FSW는 파일 시스템에서받은 이벤트를 버퍼링합니다. 너무 많은 이벤트가 동시에 발생하면이 버퍼가 오버 플로우되어 이벤트가 손실되기 시작합니다. 이벤트 처리기 코드가 정말 빨리 끝나거나 대기열 메커니즘을 사용하지 않으면 이벤트가 손실되기 시작합니다. IMO는 FSW를 100 % 미만의 신뢰할 수있는 접근 방식으로 만듭니다.

여기에 an article that discusses FSW vs performance이 있습니다.

시스템 리소스에 대한 참고 사항 : FSW는 OS 파일 시스템에 콜백 등록에 의존합니다. 나는 이것이 시스템 자원에서 얼마나 많은 부분을 차지하는지에 대한 측정법을 가지고 있지 않다. 타이머를 적극적으로 폴링하는 방법을 제안하면 파일 시스템에서 그런 리소스가 필요하지 않습니다. 파일을 가져 오는 속도에 따라 30 초마다 또는 5 분마다 파일 시스템을 폴링 할 수 있습니다.

당신이 정말 거의 실시간 동작을 필요로하지 않는 한 ...

+0

가 정교하게하십시오 : 여기

내 ONSTART의 샘플입니다. 그것은 여기저기서 파일을 놓친다면별로 중요하지 않을 것입니다. 그래서 아마도 나는 그것을 놓쳤습니다. 그리고 그들은 시스템 자원도 –

+0

에 의해 정교하게 :) –

+0

그래, idk ... 내가 파일을 가진 디렉토리를 폭파했다면 나는 폴링이나 MSMQ로 이동 같은 것을 고려할 수 있습니다. 그러나 매시간 또는 그 시간에 파일이 있습니다 ... 그것은 내 경험에 광고 된대로 작동합니다. 위로 주셔서 감사합니다 –

2

어쩌면 조합 방식이 유용 할 수 있을까? 타이머와 파일 시스템 감시자를 결합합니다.

파일에 쓸 때 임시 확장자를 사용하고 준비가되었을 때 이름을 변경하면 쓰기 도중 파일을 읽지 못하게하는 것이 유용 할 수 있습니다.

+0

+1 준비가되면 이름을 변경합니다. 나는 이것을 가장 좋은 방법이라고 생각할 것이다. – Treb

+0

파일 잠금을 올바르게 사용하면 방정식에 들어가야합니다. –

0

타이머를 사용하든 FileSystemWatcher를 사용하든 관계없이 둘 다 구독해야하는 이벤트를 실행합니다. 파일이 감지되면 이벤트가 시작됩니다. 그러면 이벤트 처리기를 실행하는 새 스레드가 시작됩니다.

따라서 OnStart 메서드에서 이벤트를 구독해야합니다. 이 경우 이벤트 처리기는 OnStart()에서 어떻게 든 액세스 할 수있는 메서드 여야합니다.

기록을 위해 FSW에 여러 번 불에 타서 더 이상 사용하지 않으면 너무 불안정합니다. 나는 Peter Lillevold이 암시하는 것을 수행하고 반복적으로 디렉토리를 폴링하기 위해 타이머를 사용하는 자신의 FileWatcher 클래스를 작성했습니다. 아마 약간 미숙 한, 그러나 그것은 작동한다. 그리고 당신은 그것을 이길 수 없습니다 ;-)

0

나는 최근에 당신이 묘사하고있는 것과 거의 비슷한 것을 만들었습니다. 처음에는 FileSystemWatcher를 사용해야한다고 생각했습니다. 문제는 그것이 일어 났을 때 나에게 사물에 대해서만 알려주는 것입니다. 어떤 이유로 든 서비스가 중단 된 후 다시 시작해야하는 경우 서비스가 시작될 때 서비스가 중단 된 동안 생성 된 파일과 관련된 이벤트가 발생하지 않았습니다.

그래서 서비스 시작시 파일을 확인한 다음 FileSystemWatcher를 사용하는 폴러를 작성하는 것을 보았습니다. 나는 어쨌든 FileSystemWatcher를 사용하는 것이 왜 두려운가를 생각하기 시작했다. 그래서 나는 완전히 그것을 떨어 뜨 렸습니다. 그리고 단지 어플리케이션이 폴러가 신생 기업에서 반복적으로했던 것을 할 필요가 있기 때문에 내 폴러가 모든 것을 할 수있게했습니다.

내 응용 프로그램은 Windows 서비스입니다. OnStart는 폴링을 수행하는 함수를 실행하는 스레드를 만듭니다. 이 기능은 OnStop에 의해 트리거 된 종료 조건의 잠시 루프이며 잠깐 폴링하고 디렉토리를 검색합니다. 그것이 무언가를 찾으면 그것을 처리하고, 그렇지 않으면 1 분 동안 잔다. 아주 간단합니다. 이 코드는 기본적이고 유지하기 쉽습니다. 나는 몇 년 동안 문제없이 실행 된 응용 프로그램에서 사용했습니다,

protected override void OnStart(string[] args) 
    { 
     WriteToLog("Starting..."); 
     bThreadRun_m = true; 

     tMain_m = new Thread(new ThreadStart(RunThread)); 
     tMain_m.Name = "Main Thread"; 
     tMain_m.Start(); 

     WriteToLog("Start Complete"); 
    } 
관련 문제