如何在不循环的情况下保持.NET控制台应用程序运行?

时间:2015-12-04 14:41:41

标签: c# console-application

考虑一个Console应用程序,它在一个单独的线程中启动某些服务。它需要做的就是等待用户按Ctrl + C将其关闭。

我已经尝试了一些示例,但所有示例都使用“do while”。

考虑以下代码:

static void Main(string[] args)
{
    for (long ContactId = 0; ContactId < 1000; ContactId++)
    {
        try
        {
            Task.WaitAll(CreateJson(ContactId));
        }
        catch (Exception ex)
        {
            System.IO.File.AppendAllText("error.txt", ContactId + "\n", encoding);
        }
    }

    Console.WriteLine("Finalizado em " + watch.Elapsed + "");
    Console.ReadKey();
 }

如何做一些“监听器”来停止所有进程并退出控制台?

我已经尝试过这个例子但对我来说效果不错(How to keep a .NET console app running?

由于

1 个答案:

答案 0 :(得分:3)

有一个event on Console class可以帮助您检测用户按下的控件+ c

Console.CancelKeyPress += myHandler;

void myHandler(object sender, ConsoleCancelEventArgs args)
{
    // do something to cancel/interrupt your jobs/tasks/threads
}

当用户按下Ctrl + C或Break键时会引发此事件。 IIRC,该事件是从Main()线程异步调用的,因此即使你的“Main”函数深入到其他代码中并且正在研究某些东西,你也会得到它。

我的意思是,如果你的主线程在Task.WaitAll中休眠,如果按下键,你仍会得到那个事件。

另一件事是,如何取消你的任务。这取决于您的长期运行任务的组织方式。如果您使用任务,线程或某些您自己的东西,可能CancellationTokenSource将成为您的朋友。 Task支持CancellationTokens / Source。您可以将令牌作为参数之一传递给Factory或Task.Run或类似的任务创建方法。但是,您还需要确保在任务的内部代码中使用 token.ThrowIfCancellationRequested() 。如果您使用某些库为您工作,它们可能不支持CancellationToken,那么您将需要研究如何正确取消/中断它们。