.NET 6中非ASP.NET定时任务长运行项目类型咨询(无系统服务/循环)
以下几种非ASP.NET项目类型可以满足你的需求,无需部署为系统服务,也能通过原生机制实现持续运行与周期性任务,避免手动编写while循环或Task.Delay:
控制台应用(Console App)+ Microsoft.Extensions.Hosting
控制台应用搭配通用宿主(Generic Host)是基础方案,你可以借助System.Threading.Timer实现周期性任务,无需自己写循环逻辑。通用宿主会自动维持进程存活,直到收到终止信号(比如Ctrl+C)。示例代码如下:using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService<TimedTaskService>(); }) .Build(); await host.RunAsync(); public class TimedTaskService : IHostedService, IDisposable { private Timer? _taskTimer; public Task StartAsync(CancellationToken cancellationToken) { // 初始化定时器:立即执行,之后每隔10秒执行一次 _taskTimer = new Timer(ExecuteTask, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); return Task.CompletedTask; } private void ExecuteTask(object? state) { // 这里写你的定时任务逻辑 Console.WriteLine($"任务执行于:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); } public Task StopAsync(CancellationToken cancellationToken) { _taskTimer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _taskTimer?.Dispose(); } }Worker Service项目
Worker Service是.NET提供的专门用于后台任务的项目模板,本质是封装好的控制台应用+通用宿主。默认模板的Worker类用了while循环,但你可以替换成上述基于System.Threading.Timer的实现,完全避免循环。它自带了宿主配置的基础结构,直接修改服务实现即可,运行方式和控制台应用一致,直接启动可执行文件,无需注册系统服务。通用主机(Generic Host)独立实现
如果你想更灵活地控制宿主逻辑,可以直接构建Generic Host,自定义服务的注册与生命周期。同样结合System.Threading.Timer或System.Timers.Timer实现周期性任务,宿主会负责管理应用的启动、运行和关闭,保持进程持续运行直到手动终止。
补充说明:这些方案依赖的是系统级定时器机制,而非自定义循环,符合你的要求。后续如果集成Quartz.NET,也可以无缝接入这些宿主中——Quartz的调度逻辑基于自身的定时器框架,并非简单的while循环,只是底层依赖系统定时器,不会让你手动编写循环代码。
内容的提问来源于stack exchange,提问作者Stack Undefined

