我需要让我的控制台应用程序在后台运行。互联网上有一些关于如何实现这一目标的提示。
最快的提示是将项目类型更改为Windows应用程序。
我尝试过,确实是它让控制台窗口消失了,但是存在问题。我的应用程序使用计时器来处理每x
秒,因此在Main
函数结束时,我放置Console.ReadLine
以阻止应用程序停止。但是,通过将项目类型切换到Windows窗体应用程序,Console.ReadLine
不会阻止应用程序完成。
所以我必须使用名为ShowWindow()的Windows 32 API函数来隐藏控制台窗口。
我的问题是,如果我坚持选择将项目类型更改为Windows Form Application
,我需要将它保持活力吗?
答案 0 :(得分:2)
请勿使用计时器,请创建 Windows服务应用程序
请不要使用 ShowWindow
,Console.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
ShowWindow
拐杖这正是Windows服务的设计目标。
答案 1 :(得分:1)
好吧,您可以使用https://github.com/Topshelf/Topshelf,这允许将其作为控制台应用程序和Windows服务运行。 Windows服务确实是你想要的理想方式,但调试Windows服务是一件痛苦的事。 Topshelf通过让您作为控制台应用程序运行和调试来简化这一过程,然后在准备就绪时,它允许您通过命令行自行注册您的应用程序作为服务。
但是,你可以去Thread.Sleep(Timeout.Infinite)
或设置一个需要触发的事件并等待事件,这样您的代码就可以在需要时退出。