我有一个目前的单线程控制台应用程序,每隔30秒执行一次......例如。
while(exitFlagNotSet)
{
doStuff();
Thread.Sleep(30000);
}
然而,我还想听一下Capture console exit C#行的申请退出。在这种情况下,我不能等待30秒 - 我的应用程序将在5s IIRC之后被强行终止。
那么有没有办法重构我的方法,所以30秒等待可能会在某些事情发生时中止?我在C ++中做过这种事情,但不知道C#/ .net中的术语和技术是什么。
答案 0 :(得分:1)
您可以使用WaitHandle
CancellationToken
来执行此操作:
static void Main(string[] args) {
var cts = new CancellationTokenSource();
var token = cts.Token;
EventHandler handler = new EventHandler(sig => {
// may want to investigate signal here
// cancel if appropriate
cts.Cancel();
return true;
});
// this is from your linked answer
SetConsoleCtrlHandler(handler, true);
while (!cts.IsCancellationRequested) {
Console.WriteLine("doing stuff");
var cancelled = token.WaitHandle.WaitOne(30000);
if (cancelled) {
// handle exit
Console.WriteLine("Cancelled!");
break;
}
}
}
当calncelled - WaitHandle
的{{1}}将被发出信号,因此CancellationToken
将返回true。如果WaitOne
因超时而退出 - 则返回false。