C# .NET控制台应用程序。用长阻塞操作取消无限循环的方法

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 (!

我正在创建一个小应用程序,用于检测系统上的一些更改。它是由管理员使用的,所以它不必很好和“完美”

我有一个检查更改的循环。我想每10秒检查一次更改。但我希望能够“取消”该线程。按一下按钮睡觉以摆脱该循环

    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