c# - Docker 中长时间运行的 C# 进程
问题描述
我有一个用 C# 编写的 Windows 服务。应用程序的这个“大脑”位于一个名为Driver
. 这个类异步启动一堆线程来做很多事情。这段代码中没有任何“阻塞”。Driver 负责启动这些线程,监听特定事件,并在这些事件上停止线程。
目前,我已将此代码包装为 Windows 服务。, OnStart
, OnStop
etc 方法只是这个类的包装器。Windows 服务按我的意愿运行。但是,现在,我想在 Docker 容器中运行此代码。我的问题是,如何修改此代码以成为一个长时间运行的进程而不是 Windows 服务。
我最初的想法是将我的代码包装在控制台应用程序中。然后,我会将代码从OnStart
控制台应用程序的正文中移出。在那段代码之后,我只需要一个while(true){}
声明来保持控制台应用程序处于活动状态。然而,这感觉就像一个黑客。
这种方法是黑客吗?或者,有没有“真正的”方法来做到这一点?如果是这样,在 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();
}
推荐阅读
- amazon-web-services - 访问被拒绝在 s3 存储桶上公开图像
- typescript - “V”型不能分配给“V”型。[2719]
- asp.net-mvc - 使用 MVC 在加载时自动打开一个弹出窗口
- php - 使用 htaccess 从文档根目录重定向到文件夹
- arrays - 将 JSON 数组索引列值转换为行并导出为 CSV
- android - 由于 google play 服务,Gradle 构建失败
- angular - 自动完成组件验证启动
- node.js - 使用 axios 将文件从服务器发送到服务器
- android-studio - 用于查找无效组件类的 Android Studio Lint?
- java - MimeMessage 电子邮件不会与附件一起发送