WaitForShutdownAsync
.NET Generic Host啟動時,執行到HostingAbstractionsHostExtensions.WaitForShutdownAsync()方法時。會使用 await TaskCompletionSource.Task的方式卡住主執行緒,直到IHostApplicationLifetime.ApplicationStopping的Callback被調用來解鎖
專案:Microsoft.Extensions.Hosting.Abstractions
類別:Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions
方法:WaitForShutdownAsync
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
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
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。