首页 > 技术文章 > Asp.Ner Core定时任务

zzr-stdio 2019-04-09 22:29 原文

<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.css" rel="stylesheet"> <title>AspNet Core定时任务</title> </head> <body> <div class="container"> <div> <h2>纪念人类首张黑洞照片发布</h2> <img src="https://raw.githubusercontent.com/ZZRRegion/Resource/master/2019%E5%B9%B44%E6%9C%8810%E6%97%A5/%E9%BB%91%E6%B4%9E.jpg" alt=""> <h2 class=" text-primary">第一种方式BackgroundService</h2> <p>基于后台服务类BackgroundService实现,类所在命名空间<span class=" text-danger">Microsoft.Extensions.Hosting;</span>添加定时服务类,示例如下</p> <pre> public class ServerTimeA : BackgroundService { private readonly ILogger&lt;ServerTimeA&gt; logger; public ServerTimeA(ILogger&lt;ServerTimeA&gt; logger) { this.logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { this.logger.LogInformation("StartA"); while (!stoppingToken.IsCancellationRequested) { this.logger.LogWarning("DoworkA..."); await Task.Delay(2000, stoppingToken); } this.logger.LogInformation("EndA..."); } } public class ServerTimeB : BackgroundService { private readonly ILogger&lt;ServerTimeB&gt; logger; public ServerTimeB(ILogger&lt;ServerTimeB&gt; logger) { this.logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { this.logger.LogInformation("StartB"); while (!stoppingToken.IsCancellationRequested) { this.logger.LogWarning("DoworkB..."); await Task.Delay(3000, stoppingToken); } this.logger.LogInformation("EndB..."); } } </pre> <div> <p>然后在Startup类中的ConfigureServices方法中添加</p> <p> <code>services.AddHostedService&lt;ServerTimeA&gt;();</code> </p> <p> <code>services.AddHostedService&lt;ServerTimeB&gt;();</code> </p> </div> <h2 class="text-primary">第二种方式quarzt</h2> <h2 class="text-primary">第三种方式Hangfire</h2> <div> <p>首先安装Hangfire库</p> <p>然后再Startup.cs的ConfigureServices函数里面注册服务</p> <pre> services.AddHangfire(config => { //使用SQLServer持久化存储 config.UseSqlServerStorage(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Administrator\Documents\haiwell.mdf;Integrated Security=True;Connect Timeout=30"); }); </pre> <p>然后再Configure中添加</p> <pre> app.UseHangfireDashboard();//启用Hangfire控制面板 app.UseHangfireServer();//启用Hangfire服务 </pre> <p>而后就可以访问<a class="text-danger" href="http://localhost:5000/hangfire">localhost:5000/Hangfire</a>来查看面板了</p> <div> <ol> <li> <p>基于队列的任务处理</p> <code> BackgroundJob.Enqueue(() => this.TestOne());//基于队列的任务处理 </code> </li> <li> <p>延迟任务执行</p> <code> BackgroundJob.Schedule(() => this.TestSchedule(), TimeSpan.FromSeconds(1)); </code> </li> <li> <p>循环任务执行</p> <code> RecurringJob.AddOrUpdate(() => this.TestAddOrUpdate(), Cron.Minutely()); </code> </li> <li> <p>继续在其父作业完成时执行</p> <code> string id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello")); </code> <code> BackgroundJob.ContinueJobWith(id, () => Console.WriteLine("World!")); </code>
                    </li>
                </ol>
            </div>
        </div>
        <h2 class="text-primary">第四种方式TimedJob</h2>
        <div>
            <p>Pomelo.AspNetCore.TimedJob是一个.Net Core实现的定时任务job库,支持毫秒级定时任务</p>
            <p>首先安装对应的包:Pomelo.AspNetCore.TimedJob</p>
            <p>然后在Startup.cs的ConfigureServices函数里面注册服务</p>
            <code>services.AddTimedJob();</code>
            <p>然后在Configure中添加</p>
            <code>app.UseTimedJob();</code>
            <p>添加一个定时执行类,继承Job类</p>
            <pre>
            public class AutoGetMovieListJob:Job
            {
                private readonly ILogger&lt;AutoGetMovieListJob&gt; logger;
                public AutoGetMovieListJob(ILogger&lt;AutoGetMovieListJob&gt; logger)
                {
                    this.logger = logger;
                }
                /// &lt;summary&gt;
                /// Begin 起始时间;Interval执行时间间隔,单位是毫秒
                /// SkipWhileExecuting是否等待上一个执行完成该,true为等待
                /// &lt;/summary&gt;
                [Invoke(Begin = "2019-04-10 20:40", Interval = 1000 * 3, SkipWhileExecuting = true)]
                public void Run()
                {
                    this.logger.LogError($"开始执行了!{DateTime.Now}");
                }
                [Invoke(Begin = "2019-04-10 20:45", Interval = 1000 * 4, SkipWhileExecuting = true)]
                public void TestA()
                {
                    this.logger.LogError($"TestA 首张黑洞照片问世!{DateTime.Now}");
                }
            }
            </pre>
        </div>
    </div>
</div>
</body>

推荐阅读