【发布时间】:2018-10-09 14:00:22
【问题描述】:
我有一个 C# 中的控制台应用程序,它可以无休止地运行,看起来像这样:
class Program
{
static void Main(string[] args)
{
while(true)
{
var listOfIds = GetItemIds();
Parallel.ForEach(listOfIds,
new Parallel { MaxDegreeOfParallelism = 15}, th => DoWork(th));
Console.WriteLine("Iteration Complete");
}
}
static void DoWork(int id)
{
//do some work and save data
}
static List<int> GetItemIds()
{
//return a list of ints
}
}
当一个线程在DoWork 中时,它正在处理、修改和存储数据。应用等待所有操作完成,然后再次进行新的迭代。
现在,如果控制台应用程序关闭,线程似乎没有完成工作并随着控制台应用程序而死。我认为使用Parallel 创建的线程独立于主线程。即使我退出控制台应用程序,有没有办法让线程完成工作?我应该使用不同的东西而不是Parallel 来创建线程吗?
【问题讨论】:
-
不要退出控制台应用程序。线程属于一个进程。一旦进程终止,您将无法让它们保持活力。也许您正在寻找一种方法来创建服务而不是控制台应用程序?
-
如果用户想要关闭您的应用程序,让他们关闭您的应用程序。当程序的用户不希望它运行时尝试运行代码是恶意软件。不要编写恶意软件。
-
程序的生命周期完全由控制台控制。如果用户按下 Ctrl+C 或 Ctrl+Break 或单击关闭按钮,那么您的程序将终止,您无法阻止它。如果这很重要,那么控制台模式项目模板不是最佳选择。也许没关系,任何事情都可以通过电源线绊倒或明智地使用任务管理器来终止。
-
@Servy - 这是关于优雅地四舍五入。你做“先保存文件?”进入恶意软件。
-
@bommelding 在关闭之前询问用户是否要保存与让程序继续静默运行(即使用户认为他们已经关闭它)之间存在很大差异。一种是让用户在关闭应用程序之前做他们可能想做的事情的选项,而不是强迫他们这样做,另一种是在他们不知情的情况下故意破坏他们的指令。
标签: c# multithreading parallel-processing console-application