.Net控制台应用程序在后台运行

时间:2018-04-16 03:58:43

标签: c# .net background console

我需要让我的控制台应用程序在后台运行。互联网上有一些关于如何实现这一目标的提示。

最快的提示是将项目类型更改为Windows应用程序。

我尝试过,确实是它让控制台窗口消失了,但是存在问题。我的应用程序使用计时器来处理每x秒,因此在Main函数结束时,我放置Console.ReadLine以阻止应用程序停止。但是,通过将项目类型切换到Windows窗体应用程序,Console.ReadLine不会阻止应用程序完成。

所以我必须使用名为ShowWindow()的Windows 32 API函数来隐藏控制台窗口。

我的问题是,如果我坚持选择将项目类型更改为Windows Form Application,我需要将它保持活力吗?

2 个答案:

答案 0 :(得分:2)

请勿使用计时器,请创建 Windows服务应用程序不要使用 ShowWindowConsole.ReadLine(),WinForms等。这听起来像是一个糟糕的应用程序设计。

通过写一个这样的简单类:

public class MyService : ServiceBase
{
    private readonly TimeSpan TimerInterval = TimeSpan.FromSeconds(5); // 'x' seconds here
    private Timer _timer; // System.Threading.Timer

    protected override void OnStart(string[] args)
    {
        _timer = new Timer(TimerCallback, null, TimeSpan.Zero, TimerInterval);
    }

    private void TimerCallback(object state)
    {
        // do whatever you want here,
        // process your requests etc.

        // this method will fire every x seconds while service is running
    }

    protected override void OnStop()
    {
        _timer.Dispose();
    }
}

您将拥有一个Windows服务应用程序:

  • 可以轻松安装,禁用,启动/重启/停止
  • 可配置为在失败后自动恢复
  • 可以作为其他用户运行,甚至可以作为本地系统帐户运行
  • 在后台运行,即使没有用户登录
  • 本身无限运行,不使用Console.ReadLine()Thread.Sleep
  • 没有GUI \控制台窗口,没有使用ShowWindow拐杖

这正是Windows服务的设计目标。

答案 1 :(得分:1)

好吧,您可以使用https://github.com/Topshelf/Topshelf,这允许将其作为控制台应用程序和Windows服务运行。 Windows服务确实是你想要的理想方式,但调试Windows服务是一件痛苦的事。 Topshelf通过让您作为控制台应用程序运行和调试来简化这一过程,然后在准备就绪时,它允许您通过命令行自行注册您的应用程序作为服务。

但是,你可以去Thread.Sleep(Timeout.Infinite)

或设置一个需要触发的事件并等待事件,这样您的代码就可以在需要时退出。