.NET Console应用程序。通过长阻塞操作取消无限循环的方法

时间:2014-09-13 13:44:44

标签: c# .net loops console

我正在创建一个小applciaiton,用于检测系统上的一些变化。它由管理员使用,因此它不需要很好,并且完美"。

我有循环来检查更改。我想每10秒检查一次更改。但我希望能够取消"那个thread.sleep按下按钮就可以退出那个循环。

    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);
        }
    }

在此任务中使用计时器的优势是什么?

1 个答案:

答案 0 :(得分:1)

使用ManualResetEvent

ManualResetEvent mre=new ManualResetEvent(false);
//......
var signalled=mre.WaitOne(TimeSpan.FromSeconds(8));
if(!signalled)
{
    //timeout occurred
}

其他地方(在8秒钟之前):

mre.Set(); //unfreezes paused Thread and causes signalled==true

并允许未阻止的线程正常终止。 Thread.Abortevil and should be avoided