公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

掌握 Cronos:使用 .NET 和控制臺實(shí)現(xiàn)定時(shí)任務(wù)的指南

admin
2024年12月25日 10:15 本文熱度 939

在現(xiàn)代應(yīng)用程序開發(fā)中,定時(shí)任務(wù)是不可或缺的組成部分。無論是數(shù)據(jù)同步、郵件發(fā)送、系統(tǒng)維護(hù),還是定期生成報(bào)告,都需要可靠的定時(shí)任務(wù)支持。本文將介紹如何使用 Cronos,一個(gè)強(qiáng)大的 .NET 任務(wù)調(diào)度庫,通過控制臺應(yīng)用程序來實(shí)現(xiàn)定時(shí)任務(wù)。

什么是 Cronos?

Cronos 是一個(gè)輕量級的 .NET 庫,用于解析和計(jì)算 CRON 表達(dá)式。它允許開發(fā)者使用熟悉的 CRON 語法來安排任務(wù)的執(zhí)行時(shí)間。Cronos 的主要特點(diǎn)包括:

  • 支持標(biāo)準(zhǔn) CRON 語法:包括秒、分、時(shí)、日、月和星期。

  • 高性能:采用高效的算法解析 CRON 表達(dá)式。

  • 靈活性:可用于各種 .NET 程序,包括控制臺、Web 應(yīng)用和服務(wù)。

環(huán)境準(zhǔn)備

在開始之前,請確保您已安裝以下環(huán)境:

  • .NET 6 SDK 或更高版本

  • 一個(gè)文本編輯器或 IDE(如 Visual Studio 或 Visual Studio Code)

安裝 Cronos 包

在項(xiàng)目中安裝 Cronos 包:

dotnet add package Cronos

實(shí)現(xiàn)定時(shí)任務(wù)

接下來,我們將創(chuàng)建一個(gè)通用的定時(shí)任務(wù)基類,使用 Cronos 來解析 CRON 表達(dá)式,并使用 Task.Delay 來等待下一個(gè)執(zhí)行時(shí)間。

創(chuàng)建基礎(chǔ)定時(shí)任務(wù)類

using Cronos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppCron
{
    public abstract class CronJob
    {

        private readonly CronExpression _expression;
        private readonly TimeZoneInfo _timeZoneInfo;

        protected CronJob(string cronExpression, TimeZoneInfo timeZoneInfo = null)
        
{
            _expression = CronExpression.Parse(cronExpression, CronFormat.IncludeSeconds); // 指定格式為包含秒  
            _timeZoneInfo = timeZoneInfo ?? TimeZoneInfo.Local;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        
{
            while (!cancellationToken.IsCancellationRequested)
            {
                var next = _expression.GetNextOccurrence(DateTimeOffset.Now, _timeZoneInfo);
                if (next.HasValue)
                {
                    var delay = next.Value - DateTimeOffset.Now;
                    if (delay.TotalMilliseconds > 0)
                    {
                        await Task.Delay(delay, cancellationToken);
                    }

                    if (!cancellationToken.IsCancellationRequested)
                    {
                        await ExecuteAsync(cancellationToken);
                    }
                }
                else
                {
                    break;
                }
            }
        }

        protected abstract Task ExecuteAsync(CancellationToken cancellationToken);
    }
}

示例任務(wù):打印消息

讓我們創(chuàng)建一個(gè)示例任務(wù),每分鐘打印一條消息。

using System;
using System.Threading;
using System.Threading.Tasks;

public class PrintMessageJob : CronJob
{
    public PrintMessageJob() : base("0 * * * * *") // 每分鐘的第 0 秒執(zhí)行
    
{
    }

    protected override Task ExecuteAsync(CancellationToken cancellationToken)
    
{
        Console.WriteLine($"當(dāng)前時(shí)間:{DateTime.Now}");
        return Task.CompletedTask;
    }
}

在主程序中運(yùn)行任務(wù)

修改 Program.cs 文件:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace CronosDemo
{
    class Program
    {

        static async Task Main(string[] args)
        
{
            var cts = new CancellationTokenSource();
            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                Console.WriteLine("正在退出...");
                cts.Cancel();
                eventArgs.Cancel = true;
            };

            var job = new PrintMessageJob();
            await job.StartAsync(cts.Token);
        }
    }
}

每分鐘,程序?qū)⑤敵霎?dāng)前時(shí)間。

更多示例

示例 1:每隔 5 秒執(zhí)行任務(wù)

修改任務(wù)的 CRON 表達(dá)式:

public class PrintMessageJob : CronJob
{
    public PrintMessageJob() : base("*/5 * * * * *") // 每隔 5 秒執(zhí)行
    
{
    }

    // 其余代碼保持不變
}

示例 2:每天凌晨 2 點(diǎn)執(zhí)行數(shù)據(jù)備份

創(chuàng)建一個(gè)新的任務(wù)類:

using System;
using System.Threading;
using System.Threading.Tasks;

public class DataBackupJob : CronJob
{
    public DataBackupJob() : base("0 0 2 * * *") // 每天凌晨 2 點(diǎn)執(zhí)行
    
{
    }

    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    
{
        Console.WriteLine("開始數(shù)據(jù)備份...");
        // 模擬備份操作
        await Task.Delay(2000, cancellationToken);
        Console.WriteLine("數(shù)據(jù)備份完成!");
    }
}

修改 Program.cs,使其可以同時(shí)管理多個(gè)任務(wù):

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace CronosDemo
{
    class Program
    {

        static async Task Main(string[] args)
        
{
            var cts = new CancellationTokenSource();
            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                Console.WriteLine("正在退出...");
                cts.Cancel();
                eventArgs.Cancel = true;
            };

            var jobs = new List<CronJob>
            {
                new PrintMessageJob(),
                new DataBackupJob()
            };

            var tasks = new List<Task>();
            foreach (var job in jobs)
            {
                tasks.Add(job.StartAsync(cts.Token));
            }

            await Task.WhenAll(tasks);
        }
    }
}

理解 CRON 表達(dá)式

CRON 表達(dá)式由空格分隔的六個(gè)字段組成:

┌──────── 秒 (0 - 59)
│ ┌────── 分鐘 (0 - 59)
│ │ ┌──── 小時(shí) (0 - 23)
│ │ │ ┌── 日期 (1 - 31)
│ │ │ │ ┌ 月份 (1 - 12)
│ │ │ │ │ ┌─ 星期 (0 - 6) [星期日=0]
│ │ │ │ │ │
* * * * * *

常用示例

  • * * * * * *:每秒執(zhí)行

  • 0 * * * * *:每分鐘的第 0 秒執(zhí)行

  • 0 0 * * * *:每小時(shí)的第 0 分 0 秒執(zhí)行

  • 0 0 2 * * *:每天凌晨 2 點(diǎn)執(zhí)行

  • 0 */5 * * * *:每隔 5 分鐘執(zhí)行

  • 0 0 9-17 * * 1-5:周一至周五的 9 點(diǎn)至 17 點(diǎn),每小時(shí)執(zhí)行一次

注意事項(xiàng)和最佳實(shí)踐

  • 時(shí)區(qū)設(shè)置:確保任務(wù)的執(zhí)行時(shí)間與預(yù)期的時(shí)區(qū)一致。默認(rèn)情況下,Cronos 使用本地時(shí)區(qū)。

  • 異常處理:在任務(wù)執(zhí)行過程中,要捕獲并處理可能的異常,防止任務(wù)崩潰。

  • 任務(wù)間隔:避免使用過短的間隔(如每秒執(zhí)行),以免對系統(tǒng)造成壓力。

  • 資源釋放:如果任務(wù)使用了文件、網(wǎng)絡(luò)連接等資源,確保在任務(wù)完成后正確釋放。

小結(jié)

Cronos 為 .NET 應(yīng)用程序提供了強(qiáng)大的定時(shí)任務(wù)調(diào)度能力。通過本文的控制臺示例,您可以輕松實(shí)現(xiàn)各種定時(shí)任務(wù)需求。記住要根據(jù)實(shí)際業(yè)務(wù)場景選擇合適的 CRON 表達(dá)式,并始終關(guān)注任務(wù)的可靠性和性能


該文章在 2024/12/25 10:15:10 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 果冻传媒麻豆系列视频 | 91成人试看福利体验区 | 国产成人做受免费视频 | 国产三级精品久久三级国专区 | 精品无码国产一区二区三区在线看 | 国产涩色av一区二区三区 | 国产成人尤物在线视频 | 国产成人综合欧美午夜不卡 | 国产激情久久久久久熟女老人 | 暴力调教一区二区三区 | 国产精品免费久久久久久蜜桃 | heyzo无码一区综合在线播放 | 国产欧美日韩在线综合网 | 91夜色精品国产网站在线观看 | 91麻豆精品国产片在线观看 | 国产精品va在线观看无码电影 | 国产福利导航一区二区三区 | 高清自拍亚洲精品二区 | 妓女妓女一区二区三 | 国产超清无码视频 | 精品波多野结衣av | 福利一区二区三区视频午夜观看 | 国产美女精品视频线播放 | 丰满女邻居的嫩苞张开视频 | 国产免费无遮挡 | 99国产三级精品三级在线专区 | 国产欧美日韩亚洲一区二区三区 | 国产精品一区二区国产馆蜜桃 | 成人欧美一区二区三区黑人免费 | 精品国产免费一区二区 | 精品熟妇av一区二区三区四区 | 国产无码乱伦一区 | 成人毛片高清视频观看 | 国产亚洲精久久久久久无码色戒 | 91国内精品久久久久影院 | 国产成人av激 | 国产91麻豆免费观看 | 国产精品线在线精品 | 国产一区免费在线观看 | 国产福利不卡在线观看 | 国产精品嫩草久久久久奇趣体验 |