我正在创建一个小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);
}
}
在此任务中使用计时器的优势是什么?
答案 0 :(得分:1)
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.Abort
为evil and should be avoided。