我需要让我的控制台应用程序在后台运行。互联网上有一些关于如何实现这一点的提示。
最快的提示是将项目类型更改为 Windows 应用程序。
我试过了,是的,它确实让控制台窗口消失了,但有一个问题。我的应用程序使用计时器每 x
秒处理一次,因此在 Main
函数的末尾,我放置了一个 Console.ReadLine
以防止应用程序停止。但是通过将项目类型切换为 Windows 窗体应用程序,Console.ReadLine
不会再阻止应用程序完成。
所以我必须使用名为 ShowWindow() 的 Windows 32 API 函数来隐藏控制台窗口。
我的问题是,如果我坚持将项目类型更改为 Windows Form Application
的选项,我需要什么才能让它保持事件状态?
最佳答案
不要使用计时器,创建一个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
- 没有 GUI\控制台窗口,没有使用
ShowWindow
拐杖
这正是 Windows 服务的设计目的。
关于c# - .Net 控制台应用程序在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49849438/