如何以编程方式停止/退出/终止 dotnet 核心 HostBuilder 控制台应用程序?

roo*_*ook 15 c# console-application .net-core

我正在尝试创建一个 dotnet 核心控制台应用程序。该应用程序是一个简单的实用程序应用程序,应该启动,执行其操作并退出。使用 Visual Studio 生成的标准控制台应用程序模板很容易实现。但是现在我们有了 HostBuilder,它似乎更有吸引力,因为它带来了与 WebHostBuilder、DI、Loggin 等的统一体验。

但看起来这种方法仅适用于长时间运行的后台服务。它将一直启动并一直保持到外部终止事件(如 Ctrl-C)。

有没有办法从内部结束这种类型的应用程序?

小智 22

您可以IHostApplicationLifetime用来停止应用程序的运行,您可以从构造函数和调用StopApplication()方法访问它。

IHostApplicationLifetime _lifeTime;
public MyClass(IHostApplicationLifetime lifeTime)
{
    _lifeTime = lifeTime;
}
Run Code Online (Sandbox Code Playgroud)

然后停止应用程序()

public void Exit()
{
    _lifeTime.StopApplication();
}
Run Code Online (Sandbox Code Playgroud)

编辑使用IHostApplicationLifetimeasIApplicationLifetime已弃用。

  • 当我在控制台中调用 _applicationLifetime.StopApplication() 时,会写入“应用程序正在关闭...”,但代码的执行也会继续,并且在以下代码中很快就会因异常而失败:( (4认同)
  • 如果有人想知道本例中的 IApplicationLifetime 从何而来,您需要使用 DI 来实现此目的。使用 HostBuilder,您可以使用ConfigureService 来进行设置,例如通过使用ServiceCollection.AddHostedService 注册IHostedService 的实现。从该级别进一步注入的任何内容都将得到相应的处理,并且像 IApplicationLifetime 这样的框架内容是开箱即用的,因此您不必手动将其添加到容器中。 (3认同)
  • “此类型已过时,将在未来版本中删除。推荐的替代方案是 Microsoft.Extensions.Hosting.IHostApplicationLifetime。” (3认同)
  • @Gondil 很高兴自己发现了这一点。我在退出后立即返回,以避免任何正在进行的命令。 (2认同)

小智 5

即使您使用HostBuilder注册应用程序中的所有依赖项,您也不必使用IHost来执行 cmd 行应用程序。您可以通过创建服务范围来执行您的应用程序,如下所示:

var hostbuilder = new HostBuilder();
builder.ConfigureServices(ConfigureServices); //Configure all services for your application here
var host = hostbuilder.Build();

using (var scope = host.Services.CreateScope())
{
   var myAppService = scope.ServiceProvider.GetRequiredService<IMyAppServiceToRun>(); //Use IHost DI container to obtain instance of service to run & resolve all dependencies

   await myAppService.StartAsync(); // Execute your task here
}

using (host)
    host.StopAsync();
Run Code Online (Sandbox Code Playgroud)