2016-09-19 53 views
3

我有一个非常简单的控制台应用程序,它将查看一个文件夹,几秒钟后它将删除所有文件。控制台应用程序需要大量的CPU资源

代码

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

“时间”的值是多少? – MattC

+0

也许日志文件被写入受监控的位置?然后它被删除,记录器再次创建,循环? – mkonvisar

回答

3

这绝对是你正在处理的控制-C方式:

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

这个循环会给你50%的CPU时间。

像这样的事情会解决这个问题:

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,它会在修改观看目录时得到通知。

相关问题