我有一个控制台应用程序,我想在所有时间保持打开,同时仍然收听事件.我已经测试过Thread.Sleep(Timeout.Infinite);,while (true) { }并且都允许在保持控制台应用程序打开的同时引发事件.我应该使用另一个吗?如果线程正在休眠,是否有任何我不应该做的事情,比如修改在类范围内声明的静态集合?
有没有办法优雅地关闭在DOCKER中运行的DOTNET CORE应用程序?如果是的话,我应该听哪个活动?
我想要的只是取消请求我想将我的取消令牌传递给当前的方法并在他们工作时推迟关闭.
寻找与dotnet核心相关的示例代码,参考链接等,而不是通用信息
更新即使在.net核心控制台应用程序中使用Console.ReadLine(), 这个问题也不会立即与docker容器出口重复,因为我没有立即退出问题.我需要利用像Windows.SystemsEvents.SessionEnding这样的事件并依赖
Console.CancelKeyPress和/或实现WebHostBuilder()不适合账单.
免责声明 - 这与Docker容器即使在.net核心控制台应用程序中使用Console.ReadLine()立即退出几乎是同一个问题- 但我不认为这个问题的接受答案是令人满意的.
我想要实现的目标
我正在构建一个控制台应用程序(它是一个使用ServiceStack的HTTP服务),它是用.NET内核构建的(dnxcore50 - 这是一个控制台应用程序,而不是ASP.NET应用程序).我在Linux机器上的docker容器中运行此应用程序.我已经完成了,HTTP服务正常工作.
我的问题
说过"我的服务有效" - 确实如此,在docker容器中托管服务存在问题.我Console.ReadLine()在启动HTTP侦听器后使用,但此代码不会在docker容器中阻塞,并且容器将在启动后立即退出.我可以在"交互"模式下启动docker容器,服务将在那里监听,直到我终止交互式会话,然后容器将退出.
Repo
代码下面的代码是用于创建测试.NET核心服务堆栈控制台应用程序的完整代码清单.
public class Program
{
public static void Main(string[] args)
{
new AppHost().Init().Start("http://*:8088/");
Console.WriteLine("listening on port 8088");
Console.ReadLine();
}
}
public class AppHost : AppSelfHostBase
{
// Initializes your AppHost Instance, with the Service Name and assembly containing the Services
public AppHost() : base("My Test Service", typeof(MyTestService).GetAssembly()) { }
// Configure your AppHost with the necessary configuration and dependencies your App needs
public …Run Code Online (Sandbox Code Playgroud) 似乎有两种类型的实质性.NET Core项目:ASP.NET Core Web App和Console App.我想在Docker环境(Linux容器)中构建类似Windows服务的东西,其中进程启动,无限期运行,并且仅在被告知时停止.两种项目类型似乎都不合适.我错过了什么吗?