考虑一个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?)
由于
答案 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,那么您将需要研究如何正确取消/中断它们。