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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...