gpt4 book ai didi

c# - 如何从 ExecuteAsync 的代码中取消 dotnet 核心工作进程?

转载 作者:行者123 更新时间:2023-12-04 15:58:18 26 4
gpt4 key购买 nike

所以我有一个 dotnet 核心工作进程,我想在某些情况下关闭工作进程。

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("This is a worker process");
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

if (condition == true)
//do something to basically shutdown the worker process with failure code.

await Task.Delay(2000, stoppingToken);
}
}
我怎样才能做到这一点?我试图跳出循环,但这并没有真正关闭工作进程。
//----this does not work-----
//even after doing this, Ctrl-C has to be done to shutdown the worker.
if (condition == true) break;

最佳答案

退出 IHostedService 不会终止应用程序本身。一个应用程序可能运行多个 IHostedService,因此其中之一关闭整个应用程序是没有意义的。
要终止应用程序,托管服务类必须接受 IHostApplicationLifetime实例,然后调用 StopApplication当它想要终止应用程序时。该接口(interface)将由 DI 中间件注入(inject):

class MyService:BackgroundService
{
IHostApplicationLifetime _lifetime;

public MyService(IHostApplicationLifetime lifetime)
{
_lifetime=lifetime;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
...
if (condition == true)
{
_lifeTime.StopApplication();
return;
}

...
}
}

}
这将通知所有其他后台服务正常终止并导致 Run()RunAsync()返回,从而退出应用程序。
throw 也不会结束应用程序。
服务要保证 StopApplication如果它希望进程终止,则调用它,例如:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
...
}
catch(Exception exc)
{
//log the exception then
_lifetime.StopApplication();
}

}

关于c# - 如何从 ExecuteAsync 的代码中取消 dotnet 核心工作进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64211112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com