【问题标题】:Keep threads alive even if console app exits即使控制台应用程序退出,也保持线程活跃
【发布时间】: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


【解决方案1】:

当窗口关闭时,控制台应用程序将终止所有线程。总是。没有办法解决这个问题。控制台窗口直接链接到进程。

您可能希望使用 Windows 应用程序,您可以更精细地控制主应用程序循环。这可以是 Windows 服务或 WinForm/WPF 类型的应用程序(如果你不想要,它甚至不需要 UI)。

如果你想要一个仍然显示控制台的 Windows 应用程序 - 这有点不靠谱,但你可以找到一个例子来说明如何做到这一点here

【讨论】:

  • 是的,起初它是为了服务。但是我们想到了将它作为一个 Web 作业安装在 Azure 中作为一个连续作业。为此,我们需要一个控制台应用程序。无论如何,你是对的,如果用户终止应用程序,它应该是这样并让它结束。我会找到另一种方法来进行“安全退出”以使主线程打破无限循环,或者尝试查看 Azure 是否可以发送事件,以便应用程序可以准备关闭。感谢您的回答!
  • 我将网络应用程序用于网络作业。效果很好。只需编写一个小 api 控制器并让它生成您想要的所有线程。
猜你喜欢
  • 2018-12-16
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2020-06-29
相关资源
最近更新 更多