2013-04-10 3 views
0

확인 다른 응용 프로그램에서 만든 파일을 기반으로 계약을 생성하는 응용 프로그램이 있습니다.파일을 볼 수있는 가장 좋은 방법

작성중인 파일을 감시하기 위해 파일 워처를 구현 한 다음 backgroundworker 프로세스를 시작하여 파일 이름을 기반으로 계약을 만듭니다.

내가 겪고있는 문제는 백그라운드 작업자 프로세스에서 나는 EnableRaisingEvents을 false로 설정하여 앱이 처음 실행되는 동안 다른 계약을 처리하기 시작하지 않는다는 것입니다. (백그라운드 작업자를 호출하는 것을 멈추기도합니다. 그것은 2 개의 물건을 즉시 달리게 할 수있는 것에 따라 달리고있다!

모두 잘되고, 다른 응용 프로그램에서 파일을 만들고, filewatcher가 파일을 선택하고 처리를 시작합니다. 문제는 처리가 끝나면 파일 워처가 다시 ​​사용 가능하게 설정되지만 언제 만들어 졌는지 EnableRaisingEvents은 거짓이었습니다. 계약서를 작성하기 위해 초기 파일을 만드는 응용 프로그램이 내 응용 프로그램을 처리하는 동안 다른 파일을 만드는 경우에는 그대로 남습니다. 말이 돼? 가장 좋은 방법은 무엇입니까?

초기 계약 생성이 끝났을 때 파일 워처가 비활성화 된 시간과 생성되지 않은 시간 사이에 생성 된 다른 파일을 디렉토리에서 보면 파일 위처를 다시 사용할 수있는 다른 프로세스가 있다고 생각했습니다. 이 작업을 수행하는 더 간단한 방법이 있는지 궁금합니다.

+0

당신은 재미있는 목록 또는 더 나은 다음 큐 및 프로세스 큐 순차적으로 –

답변

0

작업에서 프로세스를 분리 할 수 ​​있습니다. 한 가지 작업은 새로운 파일을 집어 데이터베이스에 등록하는 FileRegistrator입니다. 항상 실행되며 EnableRaisingEvents를 false로 설정할 필요가 없습니다.

다음 작업은 데이터베이스를 쿼리하고 첫 번째 프로세서를 찾고 처리하는 ProcessorTask (또는 어떤 이름이든)입니다. 새로운 파일이 등록되어 있는지 정기적으로 데이터베이스에 쿼리합니다.

Windows 서비스에서 Quartz.NET 스케줄러를 사용하여이 작은 프로세서를 구현할 수 있습니다.

은 (내가 얼마 전에 같은 약했지만 난은 FileSystemWatcher를 사용하지 않은)

0

BlockingCollection이 작업을 수행 할 것입니다.
FileWatcher를 뜨겁게 유지하고 차단 컬렉션에 추가하도록합니다.
소비자는 한 번에 하나씩 컬렉션을 처리합니다.

BlockingCollection Class

class AddTakeDemo 
{ 
    // Demonstrates: 
    //  BlockingCollection<T>.Add() 
    //  BlockingCollection<T>.Take() 
    //  BlockingCollection<T>.CompleteAdding() 
    public static void BC_AddTakeCompleteAdding() 
    { 
     // here you need to synch as it would have missed any 
     // new files while the application was down 
     // yes L-Three and any files that were not yet processed 
     // clearly the existing program is an end to end synch 
     // or no synch at all as it could be nothing else 
     using (BlockingCollection<int> bc = new BlockingCollection<int>()) 
     { 

      // Spin up a Task to populate the BlockingCollection 
      using (Task t1 = Task.Factory.StartNew(() => 
      { 
       // FielSystem watcher      
       bc.Add(fille); 

      })) 
      { 

       // Spin up a Task to consume the BlockingCollection 
       using (Task t2 = Task.Factory.StartNew(() => 
       { 
        try 
        { 
         // Consume consume the BlockingCollection 
         while (true) Console.WriteLine(bc.Take()); 
         // process the file 
        } 
        catch (InvalidOperationException) 
        { 
         // An InvalidOperationException means that Take() was called on a completed collection 
         Console.WriteLine("That's All!"); 
        } 
       })) 

        Task.WaitAll(t1, t2); 
      } 
     } 
    } 
} 
+0

에 변경된 파일을 대기열 수 있습니다! 그러나 이것은 지속되지 않습니다, 그렇죠? –

+0

@ L-Three 질문에서 끈기에 대한 요구 사항이 없습니다. – Paparazzi

+0

아니요,이 질문을 모르기 때문에 질문에 불과했습니다. –

관련 문제