控制台应用程序需要大量的CPU资源

时间:2016-09-19 08:59:04

标签: c# c#-4.0 windows-server-2008-r2

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

代码

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时,它是相同的场景。有什么问题?

2 个答案:

答案 0 :(得分:3)

这绝对是您处理Control-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事件处理程序中正确启动的任务

答案 1 :(得分:2)

你的第二个while循环是一个死循环,因此CPU使用率很高。实际上,Ctrl + C是控制台应用程序的默认中断键,您不需要编写代码来实现"这个功能。

顺便说一下,从您的代码中我想您想删除给定时间间隔内特定目录中的文件。看看FileSystemWatcher,当观看目录被修改时会收到通知。