.NET实现7*24小时运行的PDF自动打印删除程序部署咨询
将.NET控制台PDF监听程序部署为后台服务实现全天候运行
方案一:改造为原生Windows服务(推荐)
直接把控制台程序改成Windows服务,系统启动时自动运行,完全后台执行,无需终端窗口。
步骤:
- 安装NuGet包:
Microsoft.Extensions.Hosting.WindowsServices - 重构Program.cs,配置Windows服务宿主:
var host = Host.CreateDefaultBuilder(args) .UseWindowsService(opt => opt.ServiceName = "PDF自动打印服务") .ConfigureServices(services => { services.AddHostedService<PdfWatcherService>(); // 替换为你的监听服务类 }) .Build(); await host.RunAsync(); - 把原来的FileSystemWatcher逻辑封装成
BackgroundService派生类(比如PdfWatcherService):public class PdfWatcherService : BackgroundService { private FileSystemWatcher? _watcher; private readonly ILogger<PdfWatcherService> _logger; public PdfWatcherService(ILogger<PdfWatcherService> logger) { _logger = logger; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { _watcher = new FileSystemWatcher(@"C:\Path\To\Test") { Filter = "*.pdf", NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite, EnableRaisingEvents = true }; _watcher.Created += OnPdfCreated; stoppingToken.Register(() => { _watcher?.Dispose(); _logger.LogInformation("监听服务已停止"); }); _logger.LogInformation("PDF自动打印服务已启动,监听目录:C:\\Path\\To\\Test"); return Task.CompletedTask; } private void OnPdfCreated(object sender, FileSystemEventArgs e) { // 这里放你的打印、删除逻辑,注意处理文件锁定问题 try { // 等待文件写入完成(避免文件被占用) Thread.Sleep(1000); // 执行打印逻辑 // 打印完成后删除文件 File.Delete(e.FullPath); } catch (Exception ex) { _logger.LogError(ex, "处理文件 {FileName} 时出错", e.Name); } } } - 发布程序:打开命令行,运行
dotnet publish -c Release -r win-x64 --self-contained true,生成独立可执行文件 - 安装服务:以管理员身份打开命令提示符,运行
sc create "PDF自动打印服务" binPath="C:\Path\To\Published\YourApp.exe" - 启动服务并设置自动启动:
之后可以在Windows服务管理器中管理该服务。sc start "PDF自动打印服务" sc config "PDF自动打印服务" start= auto
方案二:用NSSM包装现有控制台程序为服务(无需改代码)
如果不想修改现有代码,用NSSM工具把现有exe直接包装成Windows服务。
步骤:
- 下载对应系统架构的NSSM工具,解压到本地目录
- 以管理员身份打开命令提示符,切换到NSSM所在目录,运行
nssm install "PDF自动打印服务" - 在弹出的配置窗口中:
- Application标签:设置
Path为你的exe文件路径,Working Directory为exe所在文件夹 - Details标签:填写服务名称和描述
- Log On标签:选择有Test文件夹读写权限和打印机权限的账户(建议用本地系统账户或专用服务账户)
- Application标签:设置
- 点击
Install Service完成安装,之后在服务管理器中启动服务,设置为自动启动即可。
方案三:用任务计划程序实现开机后台运行
如果不想用服务,也可以通过任务计划让程序开机自动后台运行:
- 打开「任务计划程序」,点击「创建基本任务」
- 触发器选择「当计算机启动时」
- 操作选择「启动程序」,选中你的exe文件
- 在「设置」页面勾选「不管用户是否登录都要运行」,并选择「使用最高权限运行」
- 完成后,程序会在系统启动后后台静默运行,不会显示终端窗口。
关键注意事项
- 确保程序运行账户拥有Test文件夹的读写权限和目标打印机的打印权限
- 给FileSystemWatcher添加异常捕获,避免单个文件处理失败导致整个程序崩溃
- 处理文件锁定问题:新添加的PDF可能还在写入中,建议在处理前短暂等待(如示例中的
Thread.Sleep),或者用循环尝试读取直到成功 - 独立部署时,确保发布的目标架构和服务器一致(比如win-x64对应64位系统)
内容的提问来源于stack exchange,提问作者Midlaj
相关产品推荐
相关产品推荐

