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