2步輕鬆實現ASP.NET Core托管服務執行定時任務

来源:https://www.cnblogs.com/xbhp/archive/2023/05/23/17423239.html
-Advertisement-
Play Games

最近接到一個新項目,需要在項目里添加一個後臺任務,定時去發郵件通知客戶;由於是一個比較小型的項目,不希望引入Quartz.Net、Hangfire等太重的框架,同時也沒持久化要;尋覓了一下發現ASP.NET Core本身帶有托管服務,可以執行定時任務。ASP.NET Core提供了IHostedSe ...


最近接到一個新項目,需要在項目里添加一個後臺任務,定時去發郵件通知客戶;由於是一個比較小型的項目,不希望引入Quartz.Net、Hangfire等太重的框架,同時也沒持久化要;尋覓了一下發現ASP.NET Core本身帶有托管服務,可以執行定時任務。ASP.NET Core提供了IHostedService介面,它使我們能夠創建後臺任務併在應用程式的生命周期中管理這些任務。使用IHostedService介面,我們可以實現在指定時間間隔內重覆執行的定時任務。本文將介紹如何使用IHostedService介面實現定時任務

使用步驟

1、實現IHostedService任務介面

首先,我們需要創建一個類來實現IHostedService介面。這個類將包含我們要執行的定時任務的邏輯。下麵是一個簡單的示例:

public class MyTaskService : IHostedService, IDisposable
    {
        private readonly ILogger<MyTaskService> _logs;
        private Timer timer;
        public MyTaskService(ILogger<MyTaskService> logger)
        {
            this._logs=logger;
        }
        public Task StartAsync(CancellationToken cancellationToken)
        {
            _logs.LogInformation("開始任務執行!!");
            timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
            return Task.CompletedTask;
        }
        public void DoWork(object state)
        {
            string dt = DateTime.Now.ToString();
            _logs.LogInformation("任務執行中:"+ dt.ToString()+ "!!");

        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            timer?.Change(Timeout.Infinite, 0);
            _logs.LogInformation("任務執行結束!");
            return Task.CompletedTask;
        }
        public void Dispose()
        {
            timer?.Dispose();
        }
    }
  //歡迎關註公眾號:DOTNET開發跳槽,領取海量面試題。加微信號xbhpnet入群交流

簡而言之,這是一個自定義服務,使用定時器每 30 秒執行一次任務。它實現了 IHostedService 和 IDisposable 介面,並使用依賴註入 ILogger 記錄任務執行的開始和結束。

2、註冊組件

使用定時任務需要將其註冊到ASP.NET Core應用程式中,並根據需求。在Program.cs中,添加以下代碼:

 builder.Services.AddHostedService<MyTaskService>();

3、執行效果

以上代碼全部寫完了,不需要引用任何包,很簡單吧。執行效果如下:

結語

本文提供了一個簡單的示例來演示如何使用IHostedService實現定時任務,並將其註冊到ASP.NET Core應用程式中。大家可以根據自己使用場景來配置相應生命周期的時間間隔的定時任務。它的優點是輕量級別,使用簡單;但是比較複雜的和批量的定時任務還是建議使用第三方定時任務組件,比如hangfire等主流工具。是不是很簡單?希望本文對你有所收穫。

來源公眾號:DOTNET開發跳槽

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習的文章 [小姐姐非要問我:spring編程式事務是啥? (qq.com)](https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648936779&idx=2&sn=a6255c7d436a62af380dfa6b326fd4e7&chk ...
  • Java applet 不知道有同學聽過嗎?我也只是聽過,並沒有使用過。我特意去瞭解了一下它,本文就對 Java applet 進行簡單介紹,說說它的輝煌與衰敗。僅此而已,現在已經沒人使用 Java applet 開發了。 ...
  • ## 1、概述 我們常說的JMM指的是Java記憶體模型(Java Memory Model,JMM),主要用於控制Java程式解決線程間如何通信和數據同步,JMM規範了多線程訪問共用記憶體時的 **可見性、有序性和原子性**。 - 所有的共用變數都存在**主記憶體**中; - **每個線程**都保存了一 ...
  • 以前就是一直使用 `Newtonsoft.Json` 用起來還是挺舒服的。由於 JSON 的應用越來越廣,現在. NET Core 都內置了 `System.Text.Json` 可以直接對 JSON 進行操作,不過兩個東西的體驗依然有點區別。 有時候我們會遇到的從第三方傳遞過來的 json str ...
  • C# 讀取網路上下行有多種方式,其中有一種是使用System.Net.NetworkInformation命名空間中的NetworkInterface類和PerformanceCounter類,該方式其實讀的是windows系統的性能計數器中的Network Interface類別的數據。 方式如下 ...
  • 遞歸演算法本質: 1、方法的自我調用 2、有明確的終止條件 3、每次調用時,問題規模在不斷減少。通過遞減,最終到達終止條件 ...
  • 在使用 using 等新語法時,在 VisualStudio 2019 會自動判斷框架版本,如在 net 45 就不會自動使用最新版本的語法,需要修改項目文件 在使用 C# 8.0 之前,請在官網 下載最新的 VisualStudio 2019 版本 如果在編譯時提示 “Using 聲明”在 C# ...
  • ​ 美國社會心理學家通過研究發現:當一個觀點對某人來說十分重要的時候,如果他能用這個觀點,使得一個“反對者”改變其原有意見,而和他的觀點一致,那麼他更傾向於喜歡那個“反對者”,而不是一個從始至終的同意者。這其實就是“改宗效應”。 對於那些正直的領導,一味拍馬屁,並不會換來他們的尊重,反而是那些偶然忤 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...