我有一个非常简单的控制台应用程序,它将查看一个文件夹,几秒钟后它将删除所有文件。
代码
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上运行该应用程序时,任务管理器显示以下内容:
当我使用FileWatcher时,它是相同的场景。有什么问题?
答案 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
,当观看目录被修改时会收到通知。