net6.0 使用自定義定時任務,非Quartz、Hangfire


如果不使用Quartz、Hangfire,一些簡單的定時任務完全可以用BackgroundService搞定,這是我在家為arm開發服務的時候發現的一種簡單定時任務的方式,它不用那么多框架性的東西,原生net6,輕松自在

新建一個服務類,繼承BackgroundService,重寫ExecuteAsync方法

public class MyTimedBackgroundService : BackgroundService
    {
        private static readonly int _spendSecond = 10;

        private static int SecondsUntilMidnight()
        {
            return (int)(DateTime.Now.AddSeconds(_spendSecond) - DateTime.Now).TotalSeconds;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            var countdown = SecondsUntilMidnight();

            while (!stoppingToken.IsCancellationRequested)
            {
                if (countdown-- <= 0)
                {
                    try
                    {
                        await OnTimerFiredAsync(stoppingToken);
                    }
                    catch (Exception ex)
                    {
                        // TODO: log exception
                    }
                    finally
                    {
                        countdown = SecondsUntilMidnight();
                    }
                }
                await Task.Delay(1000, stoppingToken);
            }
        }

        private async Task OnTimerFiredAsync(CancellationToken stoppingToken)
        {
            // do your work here
            Console.WriteLine("Simulating heavy I/O bound work");
            await Task.Delay(2000, stoppingToken);
        }
    }

最后在startup.cs注冊服務:

services.AddHostedService<MyTimedBackgroundService>();

重啟
搞定!

題外話:

在使用這個service之前,我新建了一個net6.0項目,我發現竟然沒有startup.cs文件,而且由於使用了global usingprogram.cs沒有了usingfunction,想注冊這個服務該怎么辦?
很簡單,使用閉包函數

var builder = WebApplication.CreateBuilder(args);

ConfigureConfiguration(builder.configuration);//基本配置
ConfigureServices(builder.Services);//注冊各種服務

var app = builder.Build();

ConfigureMiddleware(app, app.Services);//配置中間件
ConfigureEndpoints(app, app.Services);//配置終端

app.Run();

void ConfigureConfiguration(ConfigurationManager configuration) {
	//todo
}
void ConfigureServices(IServiceCollection services) {
	services.AddHostedService<MyTimedBackgroundService>();//注冊后台服務
}
void ConfigureMiddleware(IApplicationBuilder app, IServiceProvider services) {
	//todo
}
void ConfigureEndpoints(IEndpointRouteBuilder app, IServiceProvider services) {
	//todo
}

最近在學習net6.0,雖然這玩意兒發布蠻久了,但是想在網上搜到某些固定的問題還是會碰到描述不全的情況。dotnet至少語言特性是其他語言沒法比的,寫起來比較爽,我個人的小項目還是喜歡用dotnet一些,不知道你是怎么看待dotnet的?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM