等待计时器或事件,以最快的时间发生

时间:2016-06-01 16:31:44

标签: c# .net signals

我有一个目前的单线程控制台应用程序,每隔30秒执行一次......例如。

while(exitFlagNotSet)
{
 doStuff();
 Thread.Sleep(30000);
}

然而,我还想听一下Capture console exit C#行的申请退出。在这种情况下,我不能等待30秒 - 我的应用程序将在5s IIRC之后被强行终止。

那么有没有办法重构我的方法,所以30秒等待可能会在某些事情发生时中止?我在C ++中做过这种事情,但不知道C#/ .net中的术语和技术是什么。

1 个答案:

答案 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。