第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么調(diào)用 IHost.StopAsync 時(shí)會(huì)調(diào)用

為什么調(diào)用 IHost.StopAsync 時(shí)會(huì)調(diào)用

C#
蕭十郎 2023-08-20 10:18:49
假設(shè)以下使用通用主機(jī)的 .NET Core 2.2 控制臺(tái)應(yīng)用程序:using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;using System;using System.Threading;using System.Threading.Tasks;namespace SimpleGenericHost{    class SimpleHostedService : IHostedService    {        public Task StartAsync(CancellationToken cancellationToken)        {            Console.WriteLine("Service started");            return Task.CompletedTask;        }        public Task StopAsync(CancellationToken cancellationToken)        {            Console.WriteLine("Service stopped");            return Task.CompletedTask;        }    }    class Program    {        static async Task Main(string[] args)        {            var host = new HostBuilder()                .ConfigureServices(services =>                {                    services.AddHostedService<SimpleHostedService>();                })                .Build();            var runTask = host.RunAsync();            await Task.Delay(5000);            await host.StopAsync();            await runTask;        }    }}當(dāng)您運(yùn)行它時(shí),將輸出以下內(nèi)容:Service startedApplication started. Press Ctrl+C to shut down.Hosting environment: ProductionContent root path: C:\projects\ConsoleApps\SimpleGenericHost\bin\Debug\netcoreapp2.2\Service stoppedService stopped正如你所看到的,SimpleHostedService.StopAsync被調(diào)用了兩次。為什么?這是預(yù)期的嗎?我錯(cuò)過(guò)了什么嗎?IHostedService.StopAsync還有另一種方法可以停止只被調(diào)用一次的主機(jī)嗎?
查看完整描述

1 回答

?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

因?yàn)樗徽{(diào)用了兩次——一次是在延遲之后,另一次是在服務(wù)實(shí)際停止時(shí)。RunAsync它并不意味著在使用時(shí)被調(diào)用。


要在超時(shí)后停止,請(qǐng)使用帶有超時(shí)的 CancellationTokenSource 并將其令牌傳遞給RunAsync:


var timeoutCts=new CancellationTokenSource(5000);


await host.RunAsync(timeoutCts.Token);

解釋


StopAsync 不會(huì)停止服務(wù),它用于通知服務(wù)需要停止。當(dāng)應(yīng)用程序停止時(shí),它由托管服務(wù)基礎(chǔ)設(shè)施本身調(diào)用。


.NET Core 是開(kāi)源的,這意味著您可以檢查RunAsync 源。RunAsync啟動(dòng)主機(jī),然后等待終止:


await host.StartAsync(token);


await host.WaitForShutdownAsync(token);

WaitForShutdownAsync方法偵聽(tīng)來(lái)自控制臺(tái)或通過(guò)顯式調(diào)用的終止請(qǐng)求IHostApplicationLifetime.StopApplication。當(dāng)這種情況發(fā)生時(shí),它會(huì)調(diào)用StopAsync自己:


await waitForStop.Task;


// Host will use its default ShutdownTimeout if none is specified.

await host.StopAsync();

如果您打算自己管理應(yīng)用程序的生命周期,則應(yīng)該使用StartAsync而不是。RunAsync


但在這種情況下,您只需在超時(shí)時(shí)停止應(yīng)用程序。您可以通過(guò)CancellationTokenSource(int)構(gòu)造函數(shù)將取消令牌傳遞給RunAsync僅在超時(shí)后觸發(fā)的取消令牌,從而輕松地做到這一點(diǎn):


var timeoutCts=new CancellationTokenSource(5000);


await host.RunAsync(timeoutCts.Token);


查看完整回答
反對(duì) 回復(fù) 2023-08-20
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)