成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET 8 的 IHostedLifecycleService 接口是雞肋功能嗎?

開發 前端
IHostedLifecycleService?是.NET 8中引入的一個新特性,它可以讓我們在使用多個IHostedService實現的時候,更加靈活和高效地控制它們的啟動和停止,避免出現不必要的依賴和沖突。

.NET 8 引入了一個新的接口,叫做IHostedLifecycleService,這個接口繼承自現有的 IHostedService 接口,它為 BackgroundService 提供了一些新的生命周期事件的方法:

  • StartingAsync:在 StartAsync 方法之前執行,用于執行一些初始化或預處理的邏輯。
  • StartedAsync:在 StartAsync 方法之后執行,用于執行一些后處理或檢查的邏輯。
  • StoppingAsync:在 StopAsync 方法之前執行,用于執行一些清理或釋放的邏輯。
  • StoppedAsync:在 StopAsync 方法之后執行,用于執行一些收尾或報告的邏輯。

這些方法都發生在現有的 StartAsync 和 StopAsync 方法之前或之后。

示例代碼

下面的示例演示如何使用新 API:

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<MyIOWorker>();

var host = builder.Build();
host.Run();

public class MyIOWorker : BackgroundService, IHostedLifecycleService
{
    public async Task StartingAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Starting");//業務邏輯
    }
    public async Task StartedAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Started");//業務邏輯
    }
    public async Task StoppingAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Stopping");//業務邏輯
    }
    public async Task StoppedAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Stopped");//業務邏輯
    }
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine($"{nameof(MyIOWorker)} Execute");//業務邏輯
            await Task.Delay(1000, stoppingToken);
        }
    }
}

輸出結果如下:

MyIOService Starting
MyIOService Execute
MyIOService Started

...

MyIOService Stopping
MyIOService Stopped

雞肋功能?

但是,直接使用 IHostedService 接口一樣可以實現相同功能:

public class MyIOWorker : BackgroundService
{ 
    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Starting");//業務邏輯
        await base.StartAsync(cancellationToken);
        Console.WriteLine($"{nameof(MyIOWorker)} Started");//業務邏輯
    }
     
    public override async Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine($"{nameof(MyIOWorker)} Stopping");//業務邏輯
        await base.StopAsync(cancellationToken);
        Console.WriteLine($"{nameof(MyIOWorker)} Stopped");//業務邏輯
    }
    
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine($"{nameof(MyIOWorker)} ExecuteAsync");//業務邏輯
            await Task.Delay(1000, stoppingToken);
        }
    }
}

那么,新特性IHostedLifecycleService的意義何在呢?

僅僅為了,方便放置不同邏輯的代碼嗎?

探究源碼

在dotnet/runtime源碼https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Hosting/src/Internal/Host.cs中,我們找到了 IHostedLifecycleService 的使用邏輯:

// Call StartingAsync().
if (_hostedLifecycleServices is not null)
{
    await ForeachService(_hostedLifecycleServices, cancellationToken, concurrent, abortOnFirstException, exceptions,
        (service, token) => service.StartingAsync(token)).ConfigureAwait(false);

    // Exceptions in StartingAsync cause startup to be aborted.
    LogAndRethrow();
}

// Call StartAsync().
await ForeachService(_hostedServices, cancellationToken, concurrent, abortOnFirstException, exceptions,
    async (service, token) =>
    {
        await service.StartAsync(token).ConfigureAwait(false);

        if (service is BackgroundService backgroundService)
        {
            _ = TryExecuteBackgroundServiceAsync(backgroundService);
        }
    }).ConfigureAwait(false);

// Exceptions in StartAsync cause startup to be aborted.
LogAndRethrow();

// Call StartedAsync().
if (_hostedLifecycleServices is not null)
{
    await ForeachService(_hostedLifecycleServices, cancellationToken, concurrent, abortOnFirstException, exceptions,
        (service, token) => service.StartedAsync(token)).ConfigureAwait(false);
}

上面的代碼先遍歷執行IEnumerable<IHostedLifecycleService>? _hostedLifecycleServices的StartingAsync方法,再遍歷執行IEnumerable<IHostedService>? _hostedServices的StartAsync方法。

也就是說,如果存在多個IHostedLifecycleService實現,我們可以把初始化代碼放在StartingAsync方法實現中,保證了全部初始化邏輯執行成功后才會執行StartAsync方法中正式的業務邏輯。對于StopAsync方法也是同理。

使用場景

比如,如果直接使用 IHostedService 接口:

builder.Services.AddHostedService<AWorker>();
builder.Services.AddHostedService<BWorker>();

public class AWorker : BackgroundService
{ 
    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        //初始化數據庫A表
    } 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //訪問數據庫A表和B表
    }
}

public class BWorker : BackgroundService
{ 
    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        //初始化數據庫B表
    } 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //訪問數據庫A表和B表
    }
}

由于執行有先后順序,初始化數據庫B表操作還沒有執行,AWorker 就已經開始執行ExecuteAsync方法了,AWorker 的訪問數據庫A表和B表操作可能產生不可預料的結果。

現在使用IHostedLifecycleService,將初始化放在生命周期的早期:

public class AWorker : BackgroundService, IHostedLifecycleService
{
    public async Task StartingAsync(CancellationToken cancellationToken)
    {
        //初始化數據庫A表
    } 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //訪問數據庫A表和B表
    }
}

public class BWorker : BackgroundService, IHostedLifecycleService
{
    public async Task StartingAsync(CancellationToken cancellationToken)
    {
        //初始化數據庫B表
    } 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //訪問數據庫A表和B表
    }
}

現在,訪問數據庫A表和B表操作可以保證正常執行了。

默認情況下,多個IHostedLifecycleService實現是按順序執行的,我們還可以設置它們并發啟動和停止,節約整體啟動時間:

builder.Services.Configure<HostOptions>(options =>
{
    options.ServicesStartConcurrently = true;
    options.ServicesStopConcurrently = true;
});

總結

IHostedLifecycleService是.NET 8中引入的一個新特性,它可以讓我們在使用多個IHostedService實現的時候,更加靈活和高效地控制它們的啟動和停止,避免出現不必要的依賴和沖突。

責任編輯:武曉燕 來源: MyIO
相關推薦

2009-08-14 15:42:11

什么是.NET接口.NET抽象類

2024-08-29 08:02:32

2020-10-23 14:18:00

智慧社區互聯網科技

2021-03-22 17:00:15

區塊鏈NFT數字資產

2025-02-18 01:00:00

Astro系統AI

2017-09-13 16:46:38

敏捷站會團隊

2023-04-14 07:49:26

iOS安卓

2022-12-15 16:13:19

Windows11微軟

2011-11-17 14:05:47

筆記本常見問題

2023-07-09 23:55:16

C++RoslynILC

2015-09-18 09:49:50

3DTouch蘋果

2017-07-26 08:17:03

V4AppLaunchChApi

2024-12-17 08:51:55

2024-04-28 08:20:52

Controller接口URL

2021-08-28 06:03:42

5G 5G網絡5G商用

2024-11-07 12:33:47

2009-02-13 09:26:43

心態職場工作

2016-02-15 09:51:53

2024-11-12 07:28:39

2021-11-28 06:37:12

Windows11系統小組件系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人av在线播放 | 亚洲视频观看 | 免费黄色a级毛片 | 国产一区亚洲二区三区 | 国产精品69久久久久水密桃 | 黄色片在线 | 在线天堂免费中文字幕视频 | 激情五月综合 | 日韩在线播放视频 | 欧美高清免费 | 日韩在线一区二区 | 亚洲第一在线 | 欧美日韩中文字幕在线 | 国产乱码精品1区2区3区 | 久久久国产视频 | 欧美精品欧美精品系列 | 欧美日韩一区二区三区四区 | 国产精品久久久久久久久图文区 | 国产人成在线观看 | 欧美成人一区二区 | 羞羞涩涩在线观看 | 99在线观看视频 | 日韩精品网站 | 久久1区| 日韩高清中文字幕 | 国产男女猛烈无遮掩视频免费网站 | 午夜精品一区 | 手机看片1 | 日韩欧美一区在线 | 亚洲一本 | 欧美性生交大片免费 | 国产精品一区二区视频 | 欧美群妇大交群中文字幕 | 色婷婷亚洲国产女人的天堂 | 日本不卡高字幕在线2019 | 亚州综合一区 | 亚洲福利| 成人一区二区三区在线 | 国产精品毛片 | 国产精品一区二区三级 | 综合激情久久 |