Skip to main content
 首页 » 编程设计

c#之Docker 中长时间运行的 C# 进程

2024年01月29日32飞鱼

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

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

我最初的想法是将我的代码包装在控制台应用程序中。然后,我会将代码从 OnStart 移动到控制台应用程序的主体。在该代码之后,我将只有一个 while(true){} 语句来保持控制台应用程序处于事件状态。然而,这感觉像是一个 hack。

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

请您参考如下方法:

使用 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(); 
}