如何保持 .NET 控制台应用程序 运行 不循环?

How to keep a .NET console app running without looping?

考虑一个在单独线程中启动某些服务的控制台应用程序。它所需要做的就是等待用户按 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();
 }

如何"listener"停止所有进程并退出控制台?

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

谢谢

有一个 event on Console class 可以帮助您检测用户按下了 control+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 中休眠,那么如果按键被按下,您仍然会收到该事件。

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