主頁 > .NET開發 > .NET Core定時任務(控制臺程式)

.NET Core定時任務(控制臺程式)

2022-01-01 06:30:37 .NET開發

1、首先定時任務適合的程式是控制臺程式

2、NET Core中定時任務程式中一共三個檔案(1):appsettings.json組態檔(2):Program.cs路口類(加載組態檔和創建任務實體,系結觸發器)(3):TestTask1Do.cs業務邏輯類(操作的代碼)

代碼如下:

1):appsettings.json組態檔

{
  "JobCronExpr": {//cron運算式的一種,每天的23點執行任務"Test2": "0 0 23 * * ?"
  },
  
    "ConnectionStrings": {
//連接資料庫的字串,這邊用到mysql資料庫
"Default": "Server=.;Port=3306;Database=資料庫名稱;Uid=root;Pwd=root;" } }

2):Program.cs路口類

用到的NuGet包

1、Threading.Tasks

2、Quartz

using Microsoft.Extensions.Configuration;
using Quartz;
using Quartz.Impl;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Yes.Manage.Job
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("開始啟動服務……");

            Console.WriteLine("加載組態檔開始");

            //加載組態檔
            LoadConfiguration();

            Console.WriteLine("加載組態檔結束");
            try
            {
                Task.Run(async () =>
                {//啟動任務2
                    await TestTask2();
                });

                while (true)
                {
                    Console.ReadKey();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine("按任意鍵退出……");
                Console.ReadKey();
            }
        }

       private static async Task TestTask2()
        {
            ISchedulerFactory sf = new StdSchedulerFactory();
            //創建調度實體
            IScheduler scheduler = await sf.GetScheduler();
            //創建任務實體
            IJobDetail job = JobBuilder.Create<TestTask2Do>().WithIdentity(new JobKey("TestTask2Do")).Build();
            //創建觸發器實體

            //讀取Cron運算式
            string cronExpr = _configuration.GetSection("JobCronExpr:Test2")?.Value;// ConfigurationManager.AppSettings["DataAyncExpr"];

            ITrigger trigger = TriggerBuilder.Create().StartAt(DateTime.Now).WithCronSchedule(cronExpr).Build();
            await scheduler.ScheduleJob(job, trigger);     //系結觸發器和任務
            await scheduler.Start();   //啟動監控
            Console.WriteLine("TestTask2服務已啟動");
        }

        private static void LoadConfiguration()
        {
            //組態檔
            var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables();
            _configuration = builder.Build();
        }

        private static IConfigurationRoot _configuration;

    }
}

3):TestTask1Do.cs業務邏輯類(操作的代碼using Autofac;

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yes.Manage.ContainerService;
using Yes.Manage.IService;
using Yes.Manage.Models.Vo.Craftsman;

namespace Yes.Manage.Job
{
    public class TestTask2Do : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine("TestTask2Do執行任務……");

//業務邏輯代碼 await Task.Delay(100000); } } }

3、Cron運算式

Cron運算式的詳細用法
欄位 允許值 允許的特殊字符 
秒 0-59 , - * /0-59 , - * / 
小時 0-23 , - * / 
日期 1-31 , - * ? / L W C 
月份 1-12 或者 JAN-DEC , - * / 
星期 1-7 或者 SUN-SAT , - * ? / L C # 
年(可選) 留空, 1970-2099 , - * /

例子:
0/5 * * * * ? : 每5秒執行一次

“*”字符被用來指定所有的值,如:"*"在分鐘的欄位域里表示“每分鐘”, 
“?”字符只在日期域和星期域中使用,它被用來指定“非明確的值”,當你需要通過在這兩個域中的一個來指定一些東西的時候,它是有用的,看下面的例子你就會明白, 
月份中的日期和星期中的日期這兩個元素時互斥的一起應該通過設定一個問號來表明不想設定那個欄位,

“-”字符被用來指定一個范圍,如:“10-12”在小時域意味著“10點、11點、12點”,

“,”字符被用來指定另外的值,如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”,

“/”字符用于指定增量,如:“0/15”在秒域意思是每分鐘的0,15,30和45秒,“5/15”在分鐘域表示每小時的5,20,35和50,符號“*”在“/”前面(如:*/10)等價于0在“/”前面(如:0/10),記住一條本質:運算式的每個數值域都是一個有最大值和最小值的集合,如:秒域和分鐘域的集合是0-59,日期域是1-31,月份域是1-12,字符“/”可以幫助你在每個字符域中取相應的數值,如:“7/6”在月份域的時候只有當7月的時候才會觸發,并不是表示每個6月,

L是‘last’的省略寫法可以表示day-of-month和day-of-week域,但在兩個欄位中的意思不同,例如day-of-month域中表示一個月的最后一天,如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上數字,它表示一個月的最后幾天,例如‘6L’就表示一個月的最后一個星期五,

字符“W”只允許日期域出現,這個字符用于指定日期的最近作業日,例如:如果你在日期域中寫 “15W”,表示:這個月15號最近的作業日,所以,如果15號是周六,則任務會在14號觸發,如果15好是周日,則任務會在周一也就是16號觸發,如果是在日期域填寫“1W”即使1號是周六,那么任務也只會在下周一,也就是3號觸發,“W”字符指定的最近作業日是不能夠跨月份的,字符“W”只能配合一個單獨的數值使用,不能夠是一個數欄位,如:1-15W是錯誤的,

“L”和“W”可以在日期域中聯合使用,LW表示這個月最后一周的作業日,

字符“#”只允許在星期域中出現,這個字符用于指定本月的某某天,例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周),“2#1”表示本月第一周的星期一,“4#5”表示第五周的星期三,

字符“C”允許在日期域和星期域出現,這個字符依靠一個指定的“日歷”,也就是說這個運算式的值依賴于相關的“日歷”的計算結果,如果沒有“日歷”關聯,則等價于所有包含的“日歷”,如:日期域是“5C”表示關聯“日歷”中第一天,或者這個月開始的第一天的后5天,星期域是“1C”表示關聯“日歷”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一),

五、運算式舉例

每隔5秒執行一次:"*/5 * * * * ?"
每隔1分鐘執行一次:"0 */1 * * * ?"
每天23點執行一次:"0 0 23 * * ?"
每天凌晨1點執行一次:"0 0 1 * * ?"
每月1號凌晨1點執行一次:"0 0 1 1 * ?"
每月最后一天23點執行一次:"0 0 23 L * ?"
每周星期天凌晨1點實行一次:"0 0 1 ? * L"
在26分、29分、33分執行一次:"0 26,29,33 * * * ?"
每天的0點、13點、18點、21點都執行一次:"0 0 0,13,18,21 * * ?"
每天中午12點觸發:"0 0 12 * * ?"
每天上午10:15觸發:"0 15 10 ? * *"
每天上午10:15觸發:"0 15 10 * * ?"
每天上午10:15觸發:"0 15 10 * * ? *"
2005年的每天上午10:15觸發:"0 15 10 * * ? 2005"
在每天下午2點到下午2:59期間的每1分鐘觸發:"0 * 14 * * ?"
在每天下午2點到下午2:55期間的每5分鐘觸發:"0 0/5 14 * * ?"
在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發:"0 0/5 14,18 * * ?"
在每天下午2點到下午2:05期間的每1分鐘觸發:"0 0-5 14 * * ?"
每年三月的星期三的下午2:10和2:44觸發:"0 10,44 14 ? 3 WED"
周一至周五的上午10:15觸發:"0 15 10 ? * MON-FRI"
每月15日上午10:15觸發:"0 15 10 15 * ?"
每月最后一日的上午10:15觸發:"0 15 10 L * ?"
每月的最后一個星期五上午10:15觸發 :"0 15 10 ? * 6L"
2002年至2005年的每月的最后一個星期五上午10:15觸發:"0 15 10 ? * 6L 2002-2005"
每月的第三個星期五上午10:15觸發:"0 15 10 ? * 6#3"

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399553.html

標籤:.NET Core

上一篇:Winform中使用HttpClient與后端api服務進行互動

下一篇:使用.NET 6開發TodoList應用(13)——實作查詢分頁

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more