首页 > 解决方案 > Docker 中长时间运行的 C# 进程

问题描述

我有一个用 C# 编写的 Windows 服务。应用程序的这个“大脑”位于一个名为Driver. 这个类异步启动一堆线程来做很多事情。这段代码中没有任何“阻塞”。Driver 负责启动这些线程,监听特定事件,并在这些事件上停止线程。

目前,我已将此代码包装为 Windows 服务。, OnStart, OnStopetc 方法只是这个类的包装器。Windows 服务按我的意愿运行。但是,现在,我想在 Docker 容器中运行此代码。我的问题是,如何修改此代码以成为一个长时间运行的进程而不是 Windows 服务。

我最初的想法是将我的代码包装在控制台应用程序中。然后,我会将代码从OnStart控制台应用程序的正文中移出。在那段代码之后,我只需要一个while(true){}声明来保持控制台应用程序处于活动状态。然而,这感觉就像一个黑客。

这种方法是黑客吗?或者,有没有“真正的”方法来做到这一点?如果是这样,在 Docker 中拥有长期运行的 C# 应用程序的推荐方法是什么?

标签: c#docker

解决方案


使用 dotnet core 2.1,您还可以在控制台应用程序中使用从 aspnet 已知的 IHostedService,由 Microsoft.Extensions.Hosting 提供。将其与 C# >= 7.1(检查您的项目设置)结合使用,您可以在其中使用异步 Main 方法,您的代码将如下所示:

static async Task Main(string[] args)
{
  var builder = new HostBuilder(); // from Microsoft.Extensions.Hosting

  builder.ConfigureServices(s => s.AddSingleton<IHostedService, YourImplementation>());

  await builder.RunConsoleAsync();
}

推荐阅读