[.NET Core] .NET Generic Host啟動學習筆記

WaitForShutdownAsync

.NET Generic Host啟動時,執行到HostingAbstractionsHostExtensions.WaitForShutdownAsync()方法時。會使用 await TaskCompletionSource.Task的方式卡住主執行緒,直到IHostApplicationLifetime.ApplicationStopping的Callback被調用來解鎖

 

專案:Microsoft.Extensions.Hosting.Abstractions
類別:Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions
方法:WaitForShutdownAsync    

原碼:https://github.com/dotnet/runtime/tree/v5.0.0-rtm.20519.4/src/libraries/Microsoft.Extensions.Hosting.Abstractions

 

ConsoleLifetime

.NET Generic Host啟動時,預設掛載繼承IHostLifetime的ConsoleLifetime來處理Host的生命週期。在ConsoleLifetime內主要監聽四個事件:
- ApplicationLifetime.ApplicationStarted
- ApplicationLifetime.ApplicationStopping
- AppDomain.CurrentDomain.ProcessExit
- Console.CancelKeyPress

其中ApplicationLifetime.ApplicationStarted、ApplicationLifetime.ApplicationStopping單純用來寫入Host生命週期的狀態到Logger。而Console.CancelKeyPress用來處理Ctrl+C按鍵事件,並呼叫ApplicationLifetime.StopApplication來關閉Host。AppDomain.CurrentDomain.ProcessExit同樣會呼叫ApplicationLifetime.StopApplication,但是會等待HostOptions.ShutdownTimeout所設定的時間之後,才關閉整個應用程式。

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.HostBuilder
方法:CreateServiceProvider

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.Internal.Host
方法:StartAsync、StopAsync

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.Internal.ConsoleLifetime
方法:WaitForStartAsync

 

HostConfiguration、HostEnvironment

.NET Generic Host啟動時,執行到Host.CreateDefaultBuilder()方法時,會先使用HostingHostBuilderExtensions.UseContentRoot()等方法設定HostConfiguration內容。後續執行到HostBuilder.CreateHostingEnvironment()時,會參考預設值及HostConfiguration內容,建立HostEnvironment物件。

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.Host
方法:CreateDefaultBuilder

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.HostingHostBuilderExtensions
方法:UseEnvironment、UseContentRoot

專案:Microsoft.Extensions.Hosting
類別:Microsoft.Extensions.Hosting.HostBuilder
方法:CreateHostingEnvironment

原碼:https://github.com/dotnet/runtime/tree/v5.0.0-rtm.20519.4/src/libraries/Microsoft.Extensions.Hosting

 

Microsoft.Extensions.Configuration

參考:https://www.cnblogs.com/ryzen/p/12444366.html?fbclid=IwAR3IzLpFkJKunA00KeYTSvXoYfpBTswbRDoQ8N6zdNsXIOV16G4gVXdQ_yg

 

GenericWebHostService

.NET Generic Host啟動時,執行到GenericHostWebHostBuilderExtensions. ConfigureWebHost()時,會掛載GenericWebHostService到DI框架內。GenericWebHostService繼承IHostedService介面,會在Host啟動時被執行。其GenericWebHostService.StartAsync方法會啟動IServer. StartAsync()以聆聽Http封包,並通過HostingApplication管道處理。

專案:Microsoft.AspNetCore
類別:Microsoft.Extensions.Hosting.GenericHostBuilderExtensions
方法:ConfigureWebHostDefaults

專案:Microsoft.AspNetCore.Hosting
類別:Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions
方法:ConfigureWebHost

專案:Microsoft.AspNetCore.Hosting
類別:Microsoft.Extensions.Hosting.GenericWebHostService
方法:StartAsync

專案:Microsoft.AspNetCore.Hosting.Server.Abstractions
類別:Microsoft.AspNetCore.Hosting.Server.IServer
方法:StartAsync

專案:Microsoft.AspNetCore.Hosting
類別:Microsoft.AspNetCore.Hosting.HostingApplication
方法:ProcessRequestAsync

 

 

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。