.NET Core 實現後臺任務(定時任務)IHostedService(一)

来源:https://www.cnblogs.com/ysmc/archive/2022/07/08/16456787.html
-Advertisement-
Play Games

原文鏈接:https://www.cnblogs.com/ysmc/p/16456787.html 最近有小伙伴問道,在 .Net Core 中,如何定時執行任務,而因為需要執行的任務比較簡單,並不想使用其它的中間件(如 Quartz 等等),在這樣的需求下,我給大家介紹一下.Net 內置的後臺任務 ...


原文鏈接:https://www.cnblogs.com/ysmc/p/16456787.html

  最近有小伙伴問道,在 .Net Core 中,如何定時執行任務,而因為需要執行的任務比較簡單,並不想使用其它的中間件(如 Quartz 等等),在這樣的需求下,我給大家介紹一下.Net 內置的後臺任務 IHostedService

  貫徹本人的習慣,不廢話,直接上代碼,首先我們創建一個類,該類繼承 IHostedService 介面,並實現該介面成員,同時我用到了 .NET內置的定時器類 Timer,具體這個 Timer 是什麼,我這裡就不介紹了,有興趣的小伙伴可以到官方文檔瞭解 傳送門

  在不需要定時執行任務的時候,也可以在這裡進行應用啟動後的操作,例如創建 RabbitMQ 連接【手動狗頭】

  同時,我們需要在 Program.cs(.Net 5 及一下在 Startup.cs)中添加以下配置。

// .Net 6
builder.Services.AddHostedService<TestHostedService>();

// .Net  5 及以下
services.AddHostedService<TestHostedService>();
 1 public class TestHostedService : IHostedService, IDisposable
 2 {
 3     private Timer? _timer;
 4 
 5     public Task StartAsync(CancellationToken cancellationToken)
 6     {
 7         _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
 8 
 9         return Task.CompletedTask;
10     }
11 
12     private void DoWork(object? state)
13     {
14         Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
15     }
16 
17     public Task StopAsync(CancellationToken cancellationToken)
18     {
19         Console.WriteLine("StopAsync");
20 
21         return Task.CompletedTask;
22     }
23 
24 
25     public void Dispose()
26     {
27         _timer?.Dispose();
28     }        
29 }

  上面的代碼非常簡單,應用在運行後,會去執行 StartAsync 函數,應用關閉執行 StopAsync,由於我在這裡使用的定時器,所以每過5秒都會執行一次 DoWork 函數,以下是運行效果

 

   需要註意的是,這裡的定時是不等待任務執行完成,只要時間一到,就會調用 DoWork 函數,所以適合一些簡單、特定的場景,後續我將針對這些問題多寫幾個文檔,大佬們有什麼建議儘管提,加油!

以下為官方文檔對 IHostedService 介面 的說明


 

IHostedService 介面

IHostedService 介面為主機托管的對象定義了兩種方法:

  • StartAsync(CancellationToken)
  • StopAsync(CancellationToken)

StartAsync

StartAsync(CancellationToken) 包含用於啟動後臺任務的邏輯。 在以下操作之前調用 StartAsync

  • 已配置應用的請求處理管道。
  • 已啟動伺服器且已觸發 IApplicationLifetime.ApplicationStarted。

StartAsync 應僅限於短期任務,因為托管服務是按順序運行的,在 StartAsync 運行完成之前不會啟動其他服務。

StopAsync

  • StopAsync(CancellationToken) 在主機執行正常關閉時觸發。 StopAsync 包含結束後臺任務的邏輯。 實現 IDisposable 和終結器(析構函數)以處置任何非托管資源。

預設情況下,取消令牌會有五秒超時,以指示關閉進程不再正常。 在令牌上請求取消時:

  • 應中止應用正在執行的任何剩餘後臺操作。
  • StopAsync 中調用的任何方法都應及時返回。

但是,在請求取消後,將不會放棄任務,調用方會等待所有任務完成。

如果應用意外關閉(例如,應用的進程失敗),則可能不會調用 StopAsync。 因此,在 StopAsync 中執行的任何方法或操作都可能不會發生。

若要延長預設值為 5 秒的關閉超時值,請設置:

  • ShutdownTimeout(當使用通用主機時)。
  • 使用 Web 主機時為關閉超時值主機配置設置。

托管服務在應用啟動時激活一次,在應用關閉時正常關閉。 如果在執行後臺任務期間引發錯誤,即使未調用 StopAsync,也應調用 Dispose


 

寫在最後

Bootstrap Blazor 官網地址:https://www.blazor.zone

  希望大佬們看到這篇文章,能給項目點個star支持下,感謝各位!

star流程:

1、訪問點擊項目鏈接:BootstrapBlazor   star

2、點擊star,如下圖,即可完成star,關註項目不迷路:

 

另外還有兩個GVP項目,大佬們方便的話也點下star唄,非常感謝:

  BootstrapAdmin 項目地址:star
  https://gitee.com/LongbowEnterprise/BootstrapAdmin

  SliderCaptcha 項目地址:star
  https://gitee.com/LongbowEnterprise/SliderCaptcha

 

交流群(QQ)歡迎加群討論

       BA & Blazor ①(795206915)          BA & Blazor ②(675147445)


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

-Advertisement-
Play Games
更多相關文章
  • public static void main(String[] args) { ListFor(2); } public static void ListFor(int a){ //測試list集合遍歷(直接有四種遍歷方式) final ArrayList<Integer> integers = ...
  • 在看題的時候發現了Java8中新加入的日期時間類,覺得這個小哥寫的不錯,自己也跟著練習下。原文地址:https://blog.csdn.net/yy139926/article/details/124298574 前言: Java中1.8之前有date類,date類到了1.8大部分的方法被棄而且da ...
  • 🏏 前言 大家早好、午好、晚好吖~ 再寫python代碼的時候,我們有時候的習慣會導致很繁瑣的結果。 現在我整理以下9個編程好習慣,提供給大家參考一下,希望給你們帶來幫助~ 🏑 1. 提前設計 寫代碼和寫作文一樣,需要有大綱,不然很容易變成"屎山"。 思考業務邏輯和代碼流程,是動手前的準備工作, ...
  • 文件太亂了?不要慌,教你用Python全自動整理到對應分類中~ 主要知識點 文件讀寫 基礎語法 字元串處理 迴圈遍歷 素材 先來看看我這亂七八糟的文件​ 這就看起來亂七八糟了,這要是手動整理,還好,哈哈~ 但是幾百個上千個文件呢? 所以,還得是有個技能傍身才方便啊! 馬上安排! 代碼展示 # 我還給 ...
  • Nacos源碼剖析 Nacos源碼有很多值得我們學習的地方,為了深入理解Nacos,我們剖析源碼,分析如下2個知識點: 1:Nacos對註冊中心的訪問原理 2:Nacos註冊服務處理流程 源碼環境搭建 1、從官方項目上克隆下來,並且檢出 1.4.1 版本,導入idea。nacos源碼環境搭建起來比較 ...
  • 在日常生活中,郵件已經被聊天軟體、簡訊等更便捷的信息傳送方式代替。但在日常工作中,我們的重要的信息通知等非常有必要去歸檔追溯,那麼郵件就是不可或缺的信息傳送渠道。對於我們工作中經常用到的系統,裡面也基本都集成了郵件發送功能。 SpringBoot提供了基於JavaMail的starter,我們只要按 ...
  • 多商戶商城系統,也稱為B2B2C(BBC)平臺電商模式多商家商城系統。可以快速幫助企業搭建類似拼多多/京東/天貓/淘寶的綜合商城。本文通過功能拆解分析,詳細描述多商戶商城系統各個功能模塊的實現邏輯。 ...
  • java方法的重載 Java 允許同一個類中定義多個同名方法,只要它們的形參列表不同即可。如果同一個類中包含了兩個或兩個以上方法名相同的方法,但形參列表不同,這種情況被稱為方法重載(overload)。 方法重載的規則: 方法名必須相同 參數列表必須不同(參數列表的個數不同,或者類型不同,或者參數列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...