2014-04-20 2 views
0

2 백만 이상의 파일이 처리되고 10 년 동안 Windows 서비스가 활성화 된 .Net 1.1에서 3.5로 전환되었습니다. PDF 파일을 보관하는 자체 STA 스레드에서 FileSystemWatcher 이벤트 처리기를 사용하여 PDFPrinter에 그래픽을 인쇄하는 비동기 클래스가 있습니다. 기존의 클라이언트 응용 프로그램 방법으로 인해 DateTime 간격으로 누락 된 PDF를 모두 만들 수 있으므로 PDF를 비동기 적으로 만들 수 있습니다.FileSystemWatcher .Net 3.5

(1) 이벤트 처리기가 STA 스레드에서 분리되지 않으면 서비스가 중지됩니다.

(2) 몇 초 안에 도착하는 PDF가 몇 개 밖에 없으므로 정상적으로 작동합니다. 이를 5 개의 PDF로 늘리면 필연적으로 하나의 파일이 보관되지 않습니다. 15 개의 PDF로 늘리십시오. 몇몇은 보관되지 않습니다 (모든 것을 테스트 베드에서 수행하십시오). 파일을 이동하기 전에 파일이 존재하는지 확인하고 2 번의 성공적인 탐지가 필요합니다 (PDFPrinter는 팬텀 파일 생성 이벤트를 생성하는 경향이 있음). 또한 파일에 대한 독점적 액세스를 확인합니다. 업데이트 : COM 상호 작용 코드의 다른 섹션에서 다른 STA 스레드 생성 접근법 (매개 변수가있는 클래스와 메서드를 통해)을 시도했으며 신뢰할 수없는 문제 (동일한 스레드의 약 50 % 만 완료)가있었습니다.

PDF의 경우 버려진 파일을 보관하도록 Timer를 설정하려고했지만 여러 Timers가 동일한 보관 작업을 수행하지 않도록 Timer를 시작할시기가 불분명합니다 (Oracle 동시성 문제로 인한 추가 위험이 있음) ; 그 디자인은 벨트와 멜빵 같은 느낌입니다 (부정적인 요소).

이것은 일반적인 패러다임입니다. 강력한 것은 어렵지 않습니다. 깨달음 (1)을 찾고 새 STA 스레드를 안정적으로 완성하는 데 도움이됩니다 (2).

의사

Test bed user interface: 
    // Process 20 instrument raw data files in a loop 
    // For each file: 
    // 1-2 s to setup processing and retrieve metadata from database on each file 
    // (A) spin off STA worker thread 
    // call instrument vendor COM API to read data file 
    // setup FileSystemWatcher for PDF files 
    // create graphical image PDF 
    // handle PDF_Created in a shell that ... 
    // (B) spins off STA worker thread to 
    // archive the PDF 
+1

가장 간단한 재현 가능한 코드 샘플을 공유하여 추론 할 코드가 있습니까? – rene

+0

나는 진정으로 소망한다. 내가 할 수있는 최선의 방법은 의사 코드입니다. 내가 작성한 것에 대한 모든 의견은 환영받을 것이다. – beanmf

답변

0

응답 (2) : 나는 (작업자 스레드가 완료 될 때까지 예를 들어, 부모 스레드를 차단) 선형화 또는 이전 MTA 스레드와 새로운 STA 스레드를 재 동기화하는 코드를 추가했다. 의사 코드에서 점 (A)에서 잘 작동하지만 점 (B)에서 나는 여전히 필요 일부 공유 필드 변수 (실 매개 변수로 모든 PDF 파일이없는 잠재적 인 원인을 이동해야했던 곳

thread.Join(); 

)

네트워크를 통해 파일을 보관하는 FileSystemWatcher를 STA 스레드 (질문 (1))에서 처리해야하는 이유를 아직도 알지 못한다고 고백합니다.