2016-09-19 1 views
3

나는 아주 간단한 콘솔 응용 프로그램을 가지고 있습니다. 폴더 응용 프로그램은 폴더를 조사하고 몇 초 후에 모든 파일을 삭제합니다.콘솔 응용 프로그램은 많은 CPU ressource를 취합니다

코드

private static void Main(string[] args) 
    { 
     ILogger logger = new LoggerWriter(ConfigurationManager.AppSettings["Log"]); 
     Task.Factory.StartNew(() => 
     { 
     while (true) 
     { 
      var time = int.Parse(ConfigurationManager.AppSettings["Interval"]); 
      Thread.Sleep(time); 
      var directory = new DirectoryInfo(ConfigurationManager.AppSettings["Path"]); 
      foreach (var file in directory.GetFiles()) 
      { 
      file.Delete(); 
      var log = new Logger {DateTime = DateTime.Now, Action = $"File {file.FullName} will be deleted."}; 
      logger.Write(log); 
      } 
     } 
     }, TaskCreationOptions.LongRunning).ContinueWith(t => 
     { 
     if (t.Exception != null) 
      Console.WriteLine(t.Exception.Message); 
     }); 


     Console.WriteLine("Press Ctrl+C to stop."); 

     while (
     !(Console.KeyAvailable && (Console.ReadKey(true).Key == ConsoleKey.C) && 
      (Console.ReadKey(true).Modifiers == ConsoleModifiers.Control))) 
     { 
     // do something 
     } 
    } 
    } 

나는 다음과 같은 .NET 4 작업 관리자 쇼와 Windows Server 2008의 응용 프로그램을 실행할 때 :

enter image description here

나는 FileWatcher을 사용하면, 동일한 시나리오입니다. 뭐가 잘못 되었 니?

+3

구성에서 시간이 정확하게 파싱되었는지 확인하십니까? 상수로 바꾸고 더 좋아 지는지보십시오. 밀리 초를 기억하십시오 (또는 TimeSpan을 사용하십시오) –

+0

'time'의 값은 무엇입니까? – MattC

+0

아마도 로그 파일이 모니터링 된 위치에 기록 되었습니까? 그런 다음 삭제되고, 로거가 다시 생성됩니다. 루프? – mkonvisar

답변

3

확실히 당신이 제어-C를 처리하는 방법입니다. 이 같은

뭔가는 해결됩니다 :

Console.CancelKeyPress += delegate { 
    // call methods to clean up 
}; 

이 코드에 적용 :

Console.WriteLine("Press Ctrl+C to stop."); 
var exitEvent = new ManualResetEvent(false); 

Console.CancelKeyPress += (sender, eventArgs) => { 
           eventArgs.Cancel = true; 
           exitEvent.Set(); 
          }; 

exitEvent.WaitOne(); 

그것은 당신이 CancelKeyPress의 이벤트 핸들러에서 제대로 시작 작업을 취소해야 완료하려면

+0

고마워 너무 매력적입니다. –

2

두 번째 while 루프는 데드 루프이므로 높은 CPU 사용량입니다. 실제로 Ctrl + C는 콘솔 응용 프로그램의 기본 중단 키이므로이 기능을 "구현"하는 코드를 작성할 필요가 없습니다.

그런데 코드에서 특정 간격으로 특정 디렉토리의 파일을 삭제하려고한다고 생각합니다. FileSystemWatcher을 보시면 감시 디렉토리가 수정 될 때 알림을 받게됩니다. 이 루프는 당신에게 50 %의 CPU 시간을 줄 것이다

while (
    !(Console.KeyAvailable && (Console.ReadKey(true).Key == ConsoleKey.C) && 
     (Console.ReadKey(true).Modifiers == ConsoleModifiers.Control))) 
    { 
    // do something 
    } 

:

관련 문제