C# .NET控制台应用程序。用长阻塞操作取消无限循环的方法
我正在创建一个小应用程序,用于检测系统上的一些更改。它是由管理员使用的,所以它不必很好和“完美” 我有一个检查更改的循环。我想每10秒检查一次更改。但我希望能够“取消”该线程。按一下按钮睡觉以摆脱该循环C# .NET控制台应用程序。用长阻塞操作取消无限循环的方法,c#,.net,loops,console,C#,.net,Loops,Console,我正在创建一个小应用程序,用于检测系统上的一些更改。它是由管理员使用的,所以它不必很好和“完美” 我有一个检查更改的循环。我想每10秒检查一次更改。但我希望能够“取消”该线程。按一下按钮睡觉以摆脱该循环 static async void Main(string[] args) { Console.WriteLine("Logger started. Press any key to exit application.\n"); while (!
static async void Main(string[] args)
{
Console.WriteLine("Logger started. Press any key to exit application.\n");
while (!Console.KeyAvailable) //Works. but only every 10 seconds
{
CheckForAndLogChanges();
Thread.Sleep(10000);
}
//Rest of code that I want to execute right after pressing key without waiting 10s.
}
更新:
我喜欢用定时器回答
我也想到了这一点:
static void Main(string[] args)
{
Console.WriteLine("Logger started. Press any key to exit application.\n");
var backgroutTask = new Task(WorkerThread, TaskCreationOptions.LongRunning);
backgroutTask.Start();
Console.ReadKey(false);
}
static async void WorkerThread()
{
while (true)
{
CheckForAndLogChanges();
await Task.Delay(100);
}
}
在此任务中使用计时器有什么好处?使用:
其他位置(在8秒结束之前):
并允许未阻止的线程正常终止
Thread.Abort
is.这很简单,只需睡眠100毫秒,然后在检查AndLogChanges()之前计数到100。“它毕竟不必完美!”汉帕桑为了学习,我希望这个琐碎的程序尽可能完美。我想写好代码。即使对于那些简单的任务,琐碎的代码也是好代码,它的bug要少得多,维护起来也要容易得多。“如果你想了解定时器使你的生活变得悲惨的许多方式,并且它是你可能找到框架的最悲惨的一个类,那么你肯定不需要我们的帮助。”HansPassant我理解你的观点。只是,这个简单的程序不会被维护或巧妙地使用。这只是一个小工具,更适合我检查新事物,学习一点.net。我知道并不总是需要编写“完美”的代码。但我只是想尝试一下。如果我今天学的话。我将来会在更大的应用程序中使用它。@Hooch我删除了我的答案。我相信在这种情况下,定时器
是可以的。但是有不同的计时器,例如(还有更多)。有不同的方法与主线程同步,也有不同的方法等待可能的运行操作终止。我没有时间相应地扩展答案,只是不想半途而废,因为这可能会误导某些人。综上所述。我认为定时器或任务将是更好的选择。您的代码正在工作,但是ManualResetEvent对于我想要做的事情来说不是有点过火了吗?
ManualResetEvent mre=new ManualResetEvent(false);
//......
var signalled=mre.WaitOne(TimeSpan.FromSeconds(8));
if(!signalled)
{
//timeout occurred
}
mre.Set(); //unfreezes paused Thread and causes signalled==true